七 預處理命令

2021-10-16 09:47:37 字數 2183 閱讀 9682

二、預處理命令-預定義的巨集

三、預處理命令-條件式編譯

四、練習

#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 ...