#define用於定義宏,宏在源代碼展開時被處理。算法
#define 中使用參數編程
#define ADD(x,y) x+y
用宏建立字符串函數
#define PSOR(X) printf("sasds "#X" ") int main() { PSOR(12); return 0; }
預處理粘合劑:##運算spa
#define XNAME(n) x ## n #define PRINT_INT(n) printf(" "x" #n " = %d\n",x ## n) int main() { int XNAME(1) = 14;// int x1 = 14 PRINT_INT(1); // printf("x1 =%d\n",x1); return 0; }
變量宏...和_ _VA_ARGS_ _命令行
#define PR(...) printf(_ _ VR_ARGS_ _)
#define PR(X,...) printf("Message " #X " : " _ _VA_ARGS_ _ )
#include 指令用於包含其餘文件翻譯
#include<stdio.h> 在系統目錄中尋找該文件code
#inclde"mystuff.h" 在當前目錄中尋找該文件blog
#undef 用於取消已定義的#define指令內存
#define LIMIT 400 #undef LIMIT
條件編譯開發
#ifdef,#else,#endi,#ifndef
#if,#elif
#if指令很像C語言中的if,#if後面跟整形常量表達式,若是表達式爲非零,則表達式爲真。
#if SYS == 1 #include "ibmpc.h" #elif SYS == 2 #include "mac.h" #else #include "general.h" #endif
預約義宏
宏 | 含義 |
_ _DATE_ _ | 預處理日期("Mmm dd yyyy形式的字符串字面量",如Nov 23 2013) |
_ _FILE_ _ | 表示當前源代碼文件名的字符串字面量 |
_ _LINE_ _ | 表示當前源代碼文件中行號的整型變量 |
_ _STDC_ _ | 設置爲1事,表示實現遵循C標準 |
_ _STDC_HOSTED_ _ | 本機環境設置爲1,不然設置爲0 |
_ _STDC_VERSION_ _ | 支持99標準,設置爲199901L,支持11標準,設置爲201112L |
_ _TIME_ _ | 翻譯代碼的時間,格式爲"hh:mm:ss" |
C99標準提供了一個名爲_ _func_ _的預約義標識符,它展開爲一個表明函數名的字符串
int main() { printf("cur func is %s",_ _func_ _); //輸出main return 0; }
#line 和 #error
#line 指令重置_ _LINE_ _和_ _FILE_ _宏報告的行號和文件名。
#line 100 //把當前行號重置爲100 #line 10 "cool.c" //行號重置爲100 文件名重置爲cool.c
#error能夠讓預處理器發出一條錯誤信息,若是可能的話,編譯過程應該中斷。
#if _ _STD_VERSION_ _ != 201112L #error Not c11 #endif
#pragma
在現代編譯器中,能夠經過命令行參數修改編譯器一些設置,#pragma把編譯器指令放入源代碼中,例如,在開發C99時,標準稱爲C9X,能夠使用下面這個指令讓編譯器支持C9X。
#pragma c9x on
通常而言,編譯器都有本身的編譯指示集,例如,編譯指示可能用於控制分配給自動變量的內存量,或者設置錯誤檢查的嚴格程度,或者啓動非標準語言特性等。
泛型選擇
泛型編程是指那些沒有特定類型,可是一旦指定一種類型,就能夠轉換成指定類型的代碼。例如,C++中的模版中能夠建立泛型算法,而後編譯器自動根據指定的類型自動使用實列化代碼。C11新增了泛型選擇表達式。
#define MYTYPE(X) _Generic((X),int :"int",default:"other")
_Generic 是新增的關鍵字。