二、預處理命令-預定義的巨集
三、預處理命令-條件式編譯
四、練習
#define pi 3.14
#define max_n 100
#define max(a,b) (a > b ? a : b)
#define s(a, b) a * b
#define p(a)
巨集
說明__ data__
日期 : m mm_dd_yyyy
__ time__
時間 :hh:mm:ss
__ line__
行號__ func__
函式名/非標準
__ func__
函式名/非標準
__ pretty_function__
更詳細的函式資訊/非標準
函式說明
#ifdef debug
是否定義了 debug 巨集
#ifndef debug
是否沒定義了 debug 巨集
#if max == 5
巨集 max 是否等於 5
#elif max == 3
巨集max是否等於 3
#else
否則#endif
條件式編譯最後需要些
1.實現max巨集,需要通過如下測試
1、max(2,3); --> 3注:2、5 + max(2,3); --> 8
3、max(2, max(2,3)); --> 3
4、max(2, 3 > 4 ? 3 : 4); --> 4
5、max(a++, 6) a的初始值為7,函式返回值為7,a的值變為8
展示預編譯後的**(可檢視巨集所替換生成的**)
g++-e file.
cpp
**實現如下:
#include
// __typeof(a) 根據引數a
#define max(a,b) ()
// #a 將a的內容字串話
#define p(a)
intmain()
2.實現乙個列印log的函式,需要輸出所在函式及行號資訊。
注:
__file__ 以字串的形式返回所在檔名稱
__func__ 以字串的形式返回所在函式的名稱
__line__ 以整數形式返回**行號
在編譯前預定義debug
g++-ddebug file.
cpp
**實現如下
#include
// #define debug
// ## 鏈結
#ifdef debug
#define log(frm, args...)
#else
#define log(frm, args...)
#endif
#define contact(a, b) a##b
intmain()
3.巨集相關的**演示
#include
#define color(a, b) "\033[" #b "m" a "\033[0m"
#define green(a) color(a, 32)
#define red(a) color(a, 31)
#define yellow(a) color(a, 33)
// 泛型巨集 _generic((a), )
#define type_str(a) _generic((a),\
int : "%d",\
double : "%lf",\
char : "%c"\
)// 將此巨集__attribute__下面的函式先於main函式去執行
__attribute__
((constructor)
)int
add(
)int
main()
第七章 預處理命令
1 巨集定義 定義 c語言標準中允許程式用乙個識別符號來表示乙個字串,稱為巨集。在編譯預處理時,將程式中所有的巨集名用相應的字串來替換,這個過程稱為巨集替換。注 a 巨集定義是由源程式中的巨集定義命令完成的。巨集代替是由預處理程式自動完成的。b 巨集定義和其他編譯處理命令不是以分號結尾的。c 巨集定...
預處理命令
和 操作符是和 define 巨集使用的.使用 使在 後的首個引數返回為乙個帶引號的字串.例如,命令 define to string s s將會使編譯器把以下命令 cout to string hello world endl 理解為 cout hello world endl 使用 鏈結 前後的...
預處理命令
我們可以在c源程式中插入傳給編譯程式的各中指令,這些指令被稱為預處理器指令,它們擴充了程式設計的環境。現把常用的預處理命令總結如下 1.預處理程式 按照ansi標準的定義,預處理程式應該處理以下指令 if ifdef ifndef else elif endif define undef line ...