是否有可能在 C 中有类似的东西:
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
它们能共存吗?
是否有可能在 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.)