如何使用宏本身的信息重新定义C ++ #define宏?

时间:2016-04-20 05:09:02

标签: c++ macros c-preprocessor

是否可以使用宏本身的信息重新定义C ++ #define宏?我尝试了下面的代码,但由于评估宏的方式,输出不是我所期望的。

#include <iostream>

#define FINAL_DEFINE "ABC"
#define NEW_DEFINE FINAL_DEFINE "DEF" // Want ABCDEF

#undef FINAL_DEFINE
#define FINAL_DEFINE NEW_DEFINE // Want ABCDEF, but get empty?


int main ()
{
    std::cout << FINAL_DEFINE << std::endl; // Want ABCDEF, but doesn't compile.
}

3 个答案:

答案 0 :(得分:1)

在定义宏时,宏体中的宏从不展开 - 仅在使用宏时。这意味着NEW_DEFINE的定义 "ABC" "DEF",它正好出现在#define行:FINAL_DEFINE "DEF"

因此,当您使用FINAL_DEFINE时,会扩展为NEW_DEFINE,然后展开到FINAL_DEFINE "DEF"。此时它不会递归地扩展FINAL_DEFINE(因为这将导致无限循环),因此不再发生扩展。

答案 1 :(得分:0)

如果您的编译器支持push_macro&amp; pop_macro pragma指令,你可以这样做:

#include <iostream>

#define FINAL_DEFINE "ABC"
#define NEW_DEFINE FINAL_DEFINE "DEF"

int main ()
{
    std::cout << FINAL_DEFINE << std::endl; // Output ABC

    #pragma push_macro("FINAL_DEFINE")
    #define FINAL_DEFINE "XXX"
    std::cout << NEW_DEFINE << std::endl; // Output XXXDEF
    #pragma pop_macro("FINAL_DEFINE")
}

答案 2 :(得分:0)

预处理后,代码中的所有FINAL_DEFINE将替换为其定义的最后一件,然后进入编译步骤。

所以你不能像你想要的那样重新定义宏。

您的编译器应该警告您。