bp11

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されてなければ
以下のソースを削除する。
処理系(コンピュータの種類)依存のソースを書くときに使う。