預處理指令
巨集定義(#define, #undef),檔案包含(#include),條件編譯(#ifdef, #if, #elif,#else,#endif)
#define disk_capacity (sides* \
tracks_per_side* \
sectors_per_track \
bytes_per_sector)
對於帶引數的巨集定義而言,類似於這樣的引數是有***的:
i++
來看一下下面這個神奇的操作:
#define print_int(n) printf(#n" = %d\n", n)
int main()
上面這段**中的巨集在經過預處理之後是這樣的:
printf("g"
" = %d\n", n);
在c語言中,兩個相鄰的字串會被合併,也就是說,上面的**段為:
printf("g = %d\n", n);
輸出結果為:
#運算子會巨集將的乙個引數轉換為字串字面量,也就是說,n會被替換成g這個字元
再來看一下##運算子:
#include
#define print_int(n) printf(#n" = %d\n", n)
#define mk_id(n) i##n=0
int main()
輸出結果:
##運算子可以將兩個計號(識別符號)粘結在一起,可以看到上面**中的mk_id(n)巨集,會把穿進去的引數和i連線在一起,成為了變數in
,使用這個巨集,我們就能快速定義並初始化一系列變數
__line__ 被編譯檔案的行號
__file__ 被編譯的檔名
__date__ 編譯的日期
__time__ 編譯的時間
__stdc__ 如果編譯器符合c標準(c89或c98),那麼其值為1
c語言中是允許空的巨集引數的
_fun_識別符號
#include
#define function_called() printf("%s called\n", __func__);
void fun()
int main(void)
_fun_表示呼叫自己的是哪個函式
條件編譯中的所有關鍵字:
#if
defined
#ifdef
#elif
#else
#endif
條件編譯多在除錯的時候會用到:
#include
#define debug 1
int main(void)
#include
*******************************************
#define debug 0
int main(void)
*******************************************
#include
#define debug
int main(void)
我們可以通過控制debug巨集的定義與否來控制是否輸出中間結果
注意使用#if debug
的時候,判斷結果跟debug
是有關的,0
的時候為真,1
的時候為假
但在使用#if defined debug
或者ifedf debug
的時候,是不需要對debug
作準確的定義的,defined(ifdef)
只是檢查debug
是否被宣告為乙個macro
#ifdef debug = #if defined debug
這兩句話是完全等價的, C語言學習筆記(一)
c 語言只提供了以下幾種基本資料型別 char 字元刑占用乙個位元組,可以存放本地字符集中的乙個字元 int整型 通常反應了所用機器中整數的自然長度 float 單精度浮點型 doule 雙精度浮點型 此外,可以在這些基本資料型別的錢買年加上些限定符。short 與long 兩個限定符用於限定整型 ...
C語言學習筆記(一)
進製問題 1 進製 2進製 8進製 10進製 16進製制 2進製 進製規則是逢二進一,1 二進位制轉十進位制 方法 按權展開求和 二進位制怎麼會有小數點 例 規律 個位上的數字的次數是0,十位上的數字的次數是1,依次遞增,而十 分位的數字的次數是 1,百分位上數字的次數是 2,依次遞減。注意 不是任...
c語言學習筆記一
資料型別 基本型別 整型 整數 2 15 2 15 1 32768 32767 八進位制 0開頭 十六進製制 0x開頭 十進位制 占用2個位元組,16個二進位制位 浮點型 單精度 雙精度 浮點小數 雙精度 1.23 2.1e2 2.1 12 字元型單個字元 a 佔乙個位元組 轉義字元 n 單引號 s...