2
gcc (GCC) 4.7.2
c89

你好,

我一直在看一个测试套件,我注意到这个类似函数的宏声明如下:

#define MU_SUITE_START() char *msg = NULL

但是,这样做是否有任何真正的区别:

#define MU_SUITE_START char *msg = NULL

宏只是进行文本替换,所以我认为不会有任何性能问题。

使用 cpp 我得到以下结果,所以这里没什么特别的。

类函数宏

char *msg = __null;

马可

char *msg = __null;

只是一个旁注:是否值得声明一个不提供输入参数的类似函数的marco?在这里,我没有传递任何参数,即

#define PRINT_MSG() printf("This is the message\n")

如果没有输入参数,为什么还要使用类似函数的宏,这不是更好吗?

#define PRINT_MSG printf("This is the message\n")

非常感谢您的任何建议,

4

1 回答 1

5

类对象宏和类函数宏之间有一个区别:

#define OBJECT     char *msg1 = NULL
#define FUNCTION() char *msg2 = NULL

void somefunc(void)
{
    int OBJECT = 5;
    int FUNCTION = 10;
    ...
}

for 的声明OBJECT被宏替换(因此代码不会编译),但对 FUNCTION 的引用不是宏调用,因为它后面没有开括号。

这很少是重要的。然而,当它出现时,它真的很重要。

更典型的情况可能是可以实现为宏的函数。为了讨论起见(因为它很容易理解,而不是因为它是一个很好的例子):

extern int isdigit(int c);
#define isdigit(c) ((c) >= '0' && (c) <= '9')

并在实现文件中:

int (isdigit)(int c)
{
    assert((c >= 0 && c <= UCHAR_MAX) || c == EOF);
    return isdigit(c);
}

忽略这样的小细节isdigit()是不可能实现的,并且宏实现isdigit()不允许多次评估其参数,并且您不应该重新定义标准 C 库中的东西,函数定义没有宏扩展,因为名称isdigit后面没有(,但是函数内部的宏被扩展了。至少该功能是根据宏实现的,这几乎可以保证相同的行为。

于 2012-12-14T03:52:36.433 回答