程式猿之--C語言細節15(預先處理命令細節#error、運算子#和##、__FILE__、__LINE__),
主要內容:預先處理命令細節#error、運算子#和##、__FILE__、__LINE__
#include <stdio.h> /* 包含這個標頭檔,並不是將其所有函數都連結進程式*/ /* ##運算子 */ #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) #endifint 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;}
輸出: