[英]function-like macro with the same name as an object-like macro
有可能在C中有这样的东西:
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
他们可以共存吗?
C标准说(ISO / IEC 9899:1999,§6.10.3,2):
除非第二个定义是类似于对象的宏定义且两个替换列表相同,否则当前定义为类似对象宏的标识符不应由另一个#define预处理指令重新定义。 同样,当前定义为类似函数宏的标识符不应由另一个#define预处理指令重新定义,除非第二个定义是具有相同数量和参数拼写的类函数宏定义,并且两个替换列表相同。
所以答案是否定的。
不能。类似函数(带有args)和类似对象的宏(无args)不能用相同的名称定义(在标准中,尝试这样做违反了不应该规则,这意味着编译器需要诊断它)。 但是,C99指定了可变参数宏(采用1个或多个args)。 也许这会做你想要的?
您可以自由#undef MACRO_EX
并使用args重新定义它,如果这可以解决您的问题。 但它只能在有或没有args的情况下使用。
warning: "MACRO_EX" redefined [enabled by default]
在这个节目中,
#include <stdio.h>
#include <stdlib.h>
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
int main()
{
printf("\n %d %d\n", MACRO_EX, MACRO_EX(10,20));
printf("\n %d %d\n", MACRO_EX);
return 0;
}
我越来越
warning: "MACRO_EX" redefined [enabled by default]
note: this is the location of the previous definition
In function ‘main’:
error: ‘MACRO_EX’ undeclared (first use in this function)
note: each undeclared identifier is reported only once for each function it appears in
error: expected ‘)’ before ‘:’ token
如果我评论一个宏&它的用法然后工作正常:)
但按照C99标准
6.10.3
除非第二个定义是类似于对象的宏定义且两个替换列表相同,否则当前定义为object-like
宏的标识符不应由另一个#define预处理指令重新定义。 同样,当前定义为类似function-like
宏的标识符不应由另一个#define预处理指令重新定义,除非第二个定义是具有相同数字和参数拼写的类函数宏定义,以及两个替换列表是相同的。
我通过编译-std=c99
尝试相同的代码仍然得到相同的错误。
看到
#include<stdio.h>
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
int main()
{
printf("valud is %d",MACRO_EX);
return 0;
}
错误
Line 0: warning: "MACRO_EX" redefined
Line 0: warning: this is the location of the previous definition
In function 'main':
Line 10: error: 'MACRO_EX' undeclared (first use in this function)
Line 10: error: (Each undeclared identifier is reported only once
Line 10: error: for each function it appears in.)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.