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預處理器語句。預...