是否可以使用C语言:
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
他们可以共存吗?
答案 0 :(得分:5)
C standard说(ISO / IEC 9899:1999,§6.10.3,2):
当前定义为类似对象的宏的标识符不应由另一个重新定义 #define预处理指令除非第二个定义是类似对象的宏 定义和两个替换列表是相同的。同样,当前是标识符 定义为类似函数的宏不应由另一个#define重新定义 预处理指令,除非第二个定义是类似函数的宏定义 具有相同数量和参数的拼写,并且两个替换列表是 相同。
所以答案是否定的。
答案 1 :(得分:3)
没有。类似函数(带有args)和类似对象的宏(无args)不能使用相同的名称定义(在标准中,尝试这样做会违反不得规则,这意味着编译器需要诊断它)。但是,C99指定了可变参数宏(采用1个或多个args)。也许这会做你想要的?
您可以#undef MACRO_EX
自由,并使用args重新定义它,如果这可以解决您的问题。但它只能在有或没有args的情况下使用。
答案 2 :(得分:1)
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
如果我评论一个宏&amp;它的用法然后工作正常:)
但根据C99标准
6.10.3
当前定义为object-like
宏的标识符不应由另一个#define预处理指令重新定义,除非第二个定义是类似于对象的宏定义且两个替换列表相同。同样,当前定义为function-like
宏的标识符不应由另一个#define预处理指令重新定义,除非第二个定义是具有相同数量和参数拼写的类函数宏定义,并且两个替换列表是相同的。
我通过编译-std=c99
仍尝试相同的错误来尝试相同的代码。
答案 3 :(得分:0)
见
#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.)