#是在宏定義中將參數進行字符串化的預處理特徵,例如:ios
#include <iostream> using namespace std; #define P(EXP) cout<<#EXP<<":"<<EXP<<endl int main() { int a=123; float f=123.456; P(a); P(f); P(23); return 0; }
這樣能夠把不一樣變量的值和名稱打印出來,上面的例子顯示爲:this
a:123
f:123.456
23:23spa
##是鏈接符,例如:blog
#include <iostream> using namespace std; #define V(x) var##x int main() { int var1=123,var2=222,var3=321; printf("%d\n",V(1)); printf("%d\n",V(2)); printf("%d\n",V(3)); return 0; }
顯示爲:開發
123
222
321字符串
這個例子可能不是太好,感受很雞肋,不過在不少的嵌入式開發中,有不少諸如GPIOA、GPIOB等端口時,使用這種方式就比較方便了。io
注意:編譯
當宏參數是另外一個宏的時候,須要注意的是,凡宏定義裏有用’#’或’##’的地方宏參數是不會再展開,看下面的例子:class
#include <iostream> using namespace std; #define V(x) var##x int main() { int P=1; int var1=123,var2=222,var3=321; printf("%d\n",V(P)); return 0; }
這段代碼沒法經過編譯,報錯爲:error: 'varP' was not declared in this scopestream
固然,更不要幻想使用宏定義肯定P:
#include <iostream> using namespace std; #define V(x) var##x #define P 1 int main() { int var1=123,var2=222,var3=321; printf("%d\n",V(P)); return 0; }
報出的錯誤是相同的。
預處理的替換,只會作最簡單的淺層替換,而不會去考慮這個字符串是從哪裏來的