8

是否有可能在 C 中有类似的东西:

#define MACRO_EX 333

#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))

它们能共存吗?

4

4 回答 4

5

C 标准说( ISO/IEC 9899:1999, §6.10.3, 2):

当前定义为类对象宏的标识符不应由另一个#define 预处理指令重新定义,除非第二个定义是类对象宏定义并且两个替换列表相同。同样,当前定义为类函数宏的标识符不应由另一个#define 预处理指令重新定义,除非第二个定义是具有相同数量和参数拼写的类函数宏定义,并且两个替换列表相同.

所以答案是否定的。

于 2012-09-25T09:57:21.393 回答
3

不能。不能用相同的名称定义类函数(带 args)和类对象宏(无 args)(在标准术语中,尝试这样做违反了不得规则,这意味着编译器需要诊断它)。但是,C99 指定了可变参数宏(采用 1 个或多个 args)。也许那会做你想要的?

#undef MACRO_EX如果可以解决您的问题,您可以自由地使用 args 重新定义它。但它只能在有或没有 args 的情况下使用。

于 2012-09-25T09:34:57.353 回答
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

如果我评论一个宏并且它的用法那么工作正常:)

但根据 C99 标准

6.10.3

当前定义为object-like宏的标识符不应由另一个#define 预处理指令重新定义,除非第二个定义是类似对象的宏定义并且两个替换列表相同。同样,当前定义为function-like宏的标识符不应由另一个#define 预处理指令重新定义,除非第二个定义是具有相同数量和参数拼写的类似函数的宏定义,并且两个替换列表相同。

我通过编译尝试了相同的代码,-std=c99但仍然出现相同的错误。

于 2012-09-25T09:31:43.383 回答
0

http://codepad.org/0nfvOGTl

#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.)
于 2012-09-25T09:37:59.637 回答