以下代码:
#define MYDEF(x)
#define MYDEF(y)
int main() {}
给我一个error(如果pedantic-errors
被禁用则发出警告):
'MYDEF'宏重新定义
原因是未使用的参数的名称不同(更多,宏中没有正文)。但为什么?在哪些情况下它可能是个问题?
答案 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)
重新加工。