University of Electro-Communications
Human Interface section
基礎プログラミングおよび演習
第11回
担当:長谷川晶一@5階522/520
University of Electro-Communications
Human Interface section
プリプロセッサ
#で始まる行
C言語には、#で始まる行があります。
#include <stdio.h>
#define NPOINT 10
ここで、まとめておきます。
#で始まる行は、コンパイラではなく、コンパイラに
渡す前の前処理を行う、プリプロセッサが処理し
ます。
復習: プログラムの表現
高級言語(C言語,BASIC,Perl,Ruby…)
コンピュータが実行できる言語で、かつ、
人が読み書きしやすい,わかりやすい言語
mov r0 61
int main(){
sub r1 r2 @r3
printf(“Hello, world!”);
sub r1 r2 @r4
コンパイラ
return 0;
jmp r2
}
C言語(ソースコードファイル)
アセンブラ
実はこのまえに、
「プリプロセッサ」 実行形式
が処理する
0101 0100 1111 0110
1101 0111 0001 0010
1101 1110 1001 1000
0101 0100 1111 0110
1101 1110 1001 1000
アセンブ
リ言語
マシン語
プリプロセッサの働き
C言語のソースを読んで、コンパイラに渡す前に
加工します。
#define NPOINT 10
int main(){
int x[NPOINT];
return 0;
}
pre1.c
プリプロセッサ
(cpp)
int main(){
int x[10];
return 0;
}
ターミナルで
cpp ソースファイル名
とすると、変換後のファイルを見ることができます。
やってみてください。
プリプロセッサの働き(1)
#define from to
from を toに置き換える。
to はスペースから改行まで。
#define from(x,y) to
from(a,b) を to に置き換える
ただし、toの中の x ,y が
a, b に置き換わる。
一見関数っぽいが、実際は単なる
置き換え。
#define IF
if (
#define THEN
){
#define ELSE
}else{
#define ENDIF
}
int main(){
int x = rand()%10;
IF x<5 THEN printf("当たり");
ELSE printf("はずれ");
ENDIF
pre2.c
}
#define square(x) ((x)*(x))
int main(){
int a = 2; int b;
a = square(a);
// a = (a*a)になる。
b = square(a+=2);
// b = ((a+=2)*(a+=2))になる。
printf("a=%d, b=%d\n", a, b);
}
pre3.c
プリプロセッサの働き(2)
#include <ファイル名>
ファイルを #include の位置に展開する。
int before;
#include <stdio.h>
int after;
int main(){
printf("Hello world.");
}
pre4.c
int before;
typedef unsigned int size_t;
:
__c; }
int after;
int main(){
printf("Hello world.");
}
Stdio.h
の中身
ヘッダファイル(stdio.h とか math.h)には、関数の宣言
や#define がたくさん入っている。
プリプロセッサの働き(3)
#if #else #elif #endif
ソースの切り替え。 #if の後の式が0なら削除
#if 0
int x;
#else
double x;
#endif
int main(){
x = 20.5;
}
double x;
int main(){
x = 20.5;
}
#if defined _WIN32
defined _WIN32 は、 _WIN32がdefineされてなければ
以下のソースを削除する。
処理系(コンピュータの種類)依存のソースを書くときに使う。
© Copyright 2026 ExpyDoc