C++宏定義中你可能忽視的符號意思

\\ 行繼續操作符

這是我們宏定義的時候經常會使用的符號,有些時候我們定義的宏可能比較複雜,定義的宏不能用一行表達完整時,需要用"\"表示換行繼續宏的定義,不使用"\"不能編譯通過,而且這樣能夠使宏的定義美觀易讀。


# 字符串化操作符

將宏定義中的傳入參數名轉換成用一對雙引號括起來的參數名字符串。通俗的講就是不管傳入的是什麼參數,都將是一個字符串。只能用於有傳入參數的宏定義中,必須置於宏定義體中的參數名前。當傳入參數名前面和後面有空格時將被忽略;當傳入參數名間存在空格時,編譯器會自動連接各個子字符串,每個子字符串中只保留一個空格。

比如定義了以下宏:

#define test(str) #str

使用宏定義:

std::string str = test(zhai nan) 其實等價於 std::string str = “zhai nan”


## 符號連接操作符

把宏參數名與宏定義代碼序列中的標識符連接在一起,形成一個新的標識符。當用##連接形參時,##前後的空格可有可無;連接後的實際參數名,必須為實際存在的參數名或是編譯器已知的宏定義。


#@ 字符化操作符。

將傳入的單字符參數名轉換成字符,用單引用括起來。只能用於有傳入參數的宏定義中,且必須置於宏定義體中的參數名前,這個操作符其實並不常用。

比如定義了以下宏:

#define tochar(x) #@x

a = tochar(b) 其實等價於 a = 'b';


代碼實例:

<code>
#include <iostream>
#define sum(a , b)
#define test1(num) \\
std::cout << #num " = " << num << std::endl;
#define test2(num) \\
test1(a##num);
#define tochar(x) #@x
int main(int argc, char* argv[])
{
int a = 10;
int a1 = 1, a2 = 2, a3 = 3;

test1(a);

test2(1);
test2(2);
test2(3);

system("pause");
}/<iostream>/<code>

執行結果:

那些C/C++宏定義中你可能忽視的符號意思

執行結果


--|END|--


微信搜一搜“IT集裝箱”加關注,給你帶來IT技術知識分享!

那些C/C++宏定義中你可能忽視的符號意思


分享到:


相關文章: