簡體   English   中英

在宏內擴展宏

[英]Expanding macro within macro

在以下示例中,我希望看到

 doSomething 
 asserting in "doSomething()"

但是我在控制台上看不到任何輸出。

當我在main()中使用HUTAssert(doSomething())時,我看到了預期的輸出,因此我希望這與在另一個宏中擴展一個宏有關

#include <iostream>
using namespace std;
#define LOPTAssertEnabled 1
#define HUTAssert(expr) ( (expr)? (void(0)) : assertMe(#expr) ) 
#define HAOPAssert(expr) ((isLOPTAssertEnabled())? HUTAssert(#expr) : void(expr))
void assertMe(char const* expr) {
    std::cout <<" asserting in "<<expr; 
}
bool doSomething() {
    std::cout <<" did something "<<std::endl;
    return false;
}

bool isLOPTAssertEnabled() {
    return LOPTAssertEnabled;
}

int main() {
    HAOPAssert(doSomething());
}

您可以輕松地看到預處理器在做什么。 例如,對於gcc(g ++),您可以使用“ -E”選項來查看預處理器產生的內容。 就您而言,您將獲得以下信息:

void assertMe(char const* expr) {
    std::cout <<" asserting in "<<expr;
}

bool doSomething() {
    std::cout <<" did something "<<std::endl;
    return false;
}

bool isLOPTAssertEnabled() {
    return 1;
}

int main() {
    ((isLOPTAssertEnabled())? ( ("doSomething()")? (void(0)) : 
           assertMe("\"doSomething()\"") ) : void(doSomething()));
}

我相信,這不是您的期望。 但是,如果您從HUTAssert(#expr)剝離# ,這是對您的令牌進行“字符串處理”,我相信它將接近您的期望

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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