类似于函数的宏,与类似对象的宏同名

时间:2012-09-25 09:30:03

标签: c macros c-preprocessor

是否可以使用C语言:

#define MACRO_EX 333

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

他们可以共存吗?

4 个答案:

答案 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)

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.)