在c/c++的巨集定義中,#/##存在特殊的作用
1. #運算子將乙個巨集的引數轉換為字串字面量。它僅允許出現在帶引數的巨集的替換列表中。
[cpp]view plain
copy
#include
#define print_str(s) printf(#s" = %s/n", s)
intmain()
輸出:
s1 = aaa
注:
printf(#s" = %s/n", s) -> printf(s1" = %s/n", s1) -> printf("s1 = %s/n", s1)->printf("s1 = %s/n", "aaa")
#s只是做巨集引數字面替換
s則仍然是乙個變數名
2.##運算子可以將兩個記號(例如識別符號)「粘」在一起,成為乙個記號。(無需驚訝,##運算子被稱為「記號粘合」。)
如果其中乙個運算元是巨集引數,「粘合」會在當形式引數被相應的實際引數替換後發生。
[cpp]view plain
copy
#include
#define print_str(i) printf("str = %s/n", s##i)
intmain()
輸出:
str = s1str = s2
str = s3
3.c99的複雜巨集:可變引數
[cpp]view plain
copy
#include
#define print_str(format, ...) dowhile(0)
intmain()
輸出:
str1 is s1str2 is s2
but attention!
[cpp]view plain
copy
#include
#define print_str(format, ...) dowhile(0)
intmain()
編譯:
macro1.cpp: in function 『int main()』:macro1.cpp:8: error: expected primary-expression before 『)』 token
這裡提示錯誤,原因是少了變參列表,只有format引數,這裡在format引數後就多了乙個','。
so,gnu cpp想出了乙個特殊的##操作,沒錯,##操作又來了,但是不是上面的拼接行為了。
如果可變引數被忽略或為空,「##」操作將使預處理器去除掉它前面的那個逗號。
如果在巨集呼叫時,確實提供了一些可變引數,gnu cpp也會工作正常,它會把這些可變引數放到逗號的後面。
[cpp]view plain
copy
#include
#define print_str(format, ...) dowhile(0)
intmain()
輸出:
str1 is over
關於 在巨集定義中的用法
在c c 的巨集定義中,存在特殊的作用1.運算子將乙個巨集的引數轉換為字串字面量。它僅允許出現在帶引數的巨集的替換列表中。view plain copy to clipboard print?include define print str s printf s s n s int main 輸出 ...
關於巨集定義中 與 的用法
巨集在條件編譯以及各種大規模的定義裡是非常有用的。前面qt原始碼學習筆記裡就有一篇用來介紹巨集的定義。這次主要介紹下巨集定義裡 的作用。關於巨集,注意可以用gcc e test.cpp來檢視預編譯之後的結果。1.先介紹 主要是字串替換的作用。將傳入的符號轉化為字串 直接上源 define marco...
關於巨集定義的用法
如何解釋下面這段 define led1 a if a gpio setbits gpioc,gpio pin 3 else gpio resetbits gpioc,gpio pin 3 首先,這個是用巨集定義的方式包裝成類似函式那樣,但不是函式呼叫 你在 中呼叫 led1 1 實際上通過巨集定義...