如何使用其先前的定义重新定义宏

时间:2010-06-21 13:31:43

标签: macros c-preprocessor

假设我有以下宏:

#define xxx(x) printf("%s\n",x);

现在在某些文件中我想使用此宏的“增强”版本而不更改其名称。新版本探索了原始版本的功能,并做了一些工作。

#define xxx(x) do { xxx(x); yyy(x); } while(0)

这当然给了我重新发出警告,但为什么我没有在这个范围内声明'xxx'?我该如何正确定义?

编辑:根据这个http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html,它应该是可能的

6 个答案:

答案 0 :(得分:6)

不可能。宏可以使用其他宏,但它们使用扩展时可用的定义,而不是定义时间。并且C和C ++中的宏不能递归,因此新宏中的xxx不会被扩展并被视为函数。

答案 1 :(得分:3)

您将无法重用宏的旧定义,但您可以取消定义它并创建新定义。希望复制和粘贴不会太复杂。

#ifdef xxx
#undef xxx
#endif
#define xxx(x) printf("%s\n",x);

我的建议是定义xxx2宏。

#define xxx2(x) do { xxx(x); yyy(x); } while(0);

答案 2 :(得分:3)

自引用宏根本不起作用:

http://gcc.gnu.org/onlinedocs/cpp/Self_002dReferential-Macros.html#Self_002dReferential-Macros

如果您正在使用C ++,则可以使用模板函数和命名空间获得相同的结果:

template <typename T> void xxx( x ) {
        printf( "%s\n", x );
}

namespace my_namespace {

template <typename T> void xxx( T x ) {
        ::xxx(x);
        ::yyy(x);
}

}

答案 3 :(得分:2)

如果我们知道'xxx'宏中'x'参数的类型,我们可以在函数中使用它来重新定义宏,然后将'xxx'宏定义为此函数

'xxx'宏的原始定义:

#define xxx(x) printf("xxx %s\n",x);

在某个文件中制作'xxx'宏的增强版:

/* before redefining the "xxx" macro use it in function 
 * that will have enhanced version for "xxx" 
 */
static inline void __body_xxx(const char *x)
{
    xxx(x);
    printf("enhanced version\n");
}

#undef  xxx
#define xxx(x) __body_xxx(x)

答案 4 :(得分:0)

这不是你要求的,但它可以提供帮助。

在为宏提供新定义之前,您可以#undef

示例:

#ifdef xxx
#undef xxx
#endif
#define xxx(x) whatever

我从未听说过(或看过)一个递归的宏。我认为不可能。

答案 5 :(得分:0)

来自:https://gcc.gnu.org/onlinedocs/gcc/Push_002fPop-Macro-Pragmas.html

#define X  1
#pragma push_macro("X")
#undef X
#define X -1
#pragma pop_macro("X")
int x [X];