#include/* 包含這個頭文件,並不是將其所有函數都鏈接進程序*/ /* ##運算符 */ #define MK_ID(n) i##n /* 表示將兩個記號連接 */ int MK_ID(1), MK_ID(2),MK_ID(3); /* 預處理後變成int i1,i2,i3;*/ /* 定義多個type##_max函數,函數返回類型和參數類型用define決定 * 如GENERIC_MAX(int)則成了int int_max(int x, int y){return}return x > y ? x : y; */ #define GENERIC_MAX(type) \ type type##_max(type x, type y) \ { \ return x > y ? x : y; \ } /* 宏定義中如果帶有參數則需要加圓括號,如下: */ #define THREE_PI (3*3.1415) #define TEST(x) ((x)*10) /* #error用法,error表示一個嚴重錯誤,大多數編譯器會立即停止編譯*/ #if INT_MAX > 100000 #error int type is too small #endif /* #line指令用來改變給程序的行編號方式,通常編號是1,2,3,....*/ /* #運算符將一個宏的參數轉換為字符串字面量*/ #define PRINT_INT(x) printf(#x " = %d\n", x) /* 效果為PRINT_INT(i/j)==>printf("i/j" " = %d\n", i/j)==>輸出i/j = 5*/ /* #單獨占一行,是所謂的空指令,沒有任何作用,一些程序猿用來給條件編譯模塊之間的間隔*/ #if INT_MAX > 1000 # #error int # #endif /* 條件編譯*/ #define DEBUG /* 不需要給DEBUG一個值*/ #if defined(DEBUG) #endif int main(int argc, char* argv[]) { int i = 10, j = 2; PRINT_INT(i/j); printf("Compiled on %s at %d \n",__FILE__,__LINE__); /* __FILE__表示當前文件,__LINE__表示當前行,調試時用很好,特別是在嵌入式linux驅動 */ printf("%s || %s \n",__DATE__,__TIME__); /* 還有__DATE__日期,__TIME__時間*/ printf("%d\n",__STDC__); /* __STDC__查看編譯器是否結果標准C,接受則返回1*/ return 0; }