类似函数的宏没有正文但参数名称不同

时间:2016-03-28 14:06:53

标签: c++ c macros

以下代码:

#define MYDEF(x)
#define MYDEF(y)
int main() {}

给我一​​个error(如果pedantic-errors被禁用则发出警告):

  

'MYDEF'宏重新定义

原因是未使用的参数的名称不同(更多,宏中没有正文)。但为什么?在哪些情况下它可能是个问题?

2 个答案:

答案 0 :(得分:7)

因为宏不是函数。它们是预处理器完成的文本替换,不能超载。

它(几乎)类似于编辑器中的查找和替换。查找MYDEF的所有出现并将其替换为(在您的情况下为空字符串)。当然,它更复杂,但想法是一样的。

你不能超载这个发现和替换,可以吗? :)

答案 1 :(得分:0)

宏可以重新定义,宏由宏名称唯一确定。例如,代码如下:

#define MYDEF(x)  //the name of the macro is 'MYDEF'
#define MYDEF(x, y) //the name of the macro is 'MYDEF' too

MYDEF(x)将由MYDEF(x, y)重新加盖(或覆盖),在定义MYDEF(x)后,您无法再编写代码MYDEF(x, y)

所以,如果你写代码:

 #define MYDEF(x)
 #define MYDEF(y) //(There compiler will give warning). You can write 
                  //`#undef MYDEF` before `#define MYDEF(y)` to avoid it.

MYDEF(x)将由MYDEF(y)重新加工。