[英]Print a #define macro using std::cout
我正在嘗試這樣做
#define _TEST_ test
#include <iostream>
int main()
{
std::cout << "_TEST_" << std::endl;
}
據我了解,我希望這個 output。
test
但是,我得到的 output 是
_TEST_
為什么我在這里做錯了?
C/C++ 預處理器中的宏擴展只發生在標記上。 例如,變量名稱是標記。 但是字符串內部不是標記; 它是更大標記的一部分(即字符串文字本身)。
如果你想讓宏擴展到引號內的東西,你需要使用stringification 。
#define xstr(x) str(x)
#define str(x) #x
#define _TEST_ test
#include <iostream>
int main()
{
std::cout << xstr(_TEST_) << std::endl;
}
您可以閱讀上面的鏈接了解為什么我們需要那些額外的兩層間接( xstr
和str
),但基本思想是#
本身不進行宏擴展,因此通過調用xstr
,我們強制對參數進行宏擴展( _TEST_
進入test
,即),然后我們分別調用str
對其進行字符串化。 如果我們只是直接調用str
,它會看到#_TEST_
而不會執行宏擴展。
"_TEST_"
是字符串文字而不是宏。 因此,由於"_TEST_"
,將不會進行任何宏替換。 要實現預期的 output,您需要刪除周圍的雙引號並將宏更改為如下所示
//-------------vvvvvv--->double quotes added here
#define _TEST_ "test"
#include <iostream>
int main()
{
//-------------------vvvvvv---------------> not withing quotes
std::cout << _TEST_ << std::endl;
}
上面修改后的程序的output為:
test
在修改后的程序中,宏_TEST_
代表字符串文字"test"
。 因此,當我們在語句std::cout << _TEST_ << std::endl;
中使用該宏時 ,它將被字符串文字替換,產生預期的 output。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.