假设我有以下宏:
#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,它应该是可能的
答案 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];