define進行多行巨集定義

2021-05-08 06:53:28 字數 1890 閱讀 9148

define進行多行巨集定義

#define     dorecovery()/  

led_run=1;/  

val1=off;/  

val2=off;/  

pump=off;/  

val3=on;/  

compre=on;

#define str_output_format_v0  "%s%s%s/n"

printf(str_output_format_v0, "hello ", "macro, ", "yeah!");

程式輸出:hello macro, yeah!

由於真實**中這個串很長,所以打算美化一下格式,定義成下面的樣子:

#define str_output_format_v1  "%s/

%s/

%s/n"

printf(str_output_format_v1, "hello ", "macro, ", "yeah!");

程式輸出:hello                                macro,                                yeah!

這樣的定義顯然不對,也在我意料之中,續行符將空格也續到格式串中了,導致輸出的結果中帶有大量空格。

改進一下,利用c語言的字串自動連線語法。

#define str_output_format_v2  "%s"/

"%s"/

"%s/n"

printf(str_output_format_v2, "hello ", "macro, ", "yeah!");

程式輸出:hello macro, yeah!

現在的問題是如何在這樣乙個多行的巨集定義裡加入注釋,字段含義特殊,加上注釋有利於以後維護以及別人閱讀你的**,否則一堆%s%s,讓人看了就頭痛。先這麼加試試:

#define str_output_format_e1  "%s"/   /* comment1 */

"%s"/   /* comment2 */

"%s/n"  /* comment3 */

printf(str_output_format_e1, "hello ", "macro, ", "yeah!");

我們得到的結果:編譯錯誤。

通過gcc -e 選項我們看到,巨集替換後的**:

"%s"/

"%s/n"

int main()

由於沒有續行符在注釋前面,所以巨集定義的後兩行實際上並沒有被包含在巨集定義中,就像沒有暫住證的人一樣,被gcc這個"警察"逮個正著。

繼續改進:

#define str_output_format_v3  "%s"   /* comment1 */ /

"%s"   /* comment2 */ /

"%s/n"  /* comment3 */

printf(str_output_format_v3, "hello ", "macro, ", "yeah!");

程式輸出:hello macro, yeah!

顯然預編譯器忽略巨集定義中的注釋以及空格,str_output_format_v3就完全符合我的要求了。

當然,很多人不建議使用巨集,特別是c++的fans,巨集也的確有很多弊端,這裡也有替代方法:

const char *str_output_format = "%s"    /* comment1 */

"%s"    /* comment2 */

"%s/n"; /* comment3 */

printf(str_output_format, "hello ", "macro, ", "yeah!");

程式輸出:hello macro, yeah!

如何用 define巨集定義多行函式

在軟體開發過程中,經常有一些常用或者通用的功能或者 段,這些功能既可以寫成函式,也可以封裝成為巨集定義。那麼究竟是用函式好,還是巨集定義好?這就要求我們對二者進行合理的取捨。首先,函式呼叫會帶來額外的開銷,它需要開闢一片棧空間,記錄返回位址,將形參壓棧,從函式返回還要釋放堆疊。這種開銷不僅會降低 效...

define巨集定義

預處理指令 以 開頭的行,都預處理指令,用於指示編譯器做一些預處理工作。比如 include h 注 預處理指令不是語句,行尾不要加分號 define的兩種用法 1.定義乙個 數值 2.定義乙個 算式 注 工程中應該避免使用這兩種方式 定義乙個值 define pi 3.14 int main 定義...

巨集定義 define

巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串。1 define printx printf d n x 在c程式中,以 字元開頭的 都是一條c預處理器語句。預...