簡體   English   中英

使用 std::cout 打印 #define 宏

[英]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;
}

您可以閱讀上面的鏈接了解為什么我們需要那些額外的兩層間接( xstrstr ),但基本思想是#本身不進行宏擴展,因此通過調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM