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 2024 ExpyDoc