类似函数的宏与宏

ant*_*009 2 c macros

gcc (GCC) 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)

你好,

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

#define MU_SUITE_START() char *msg = NULL
Run Code Online (Sandbox Code Playgroud)

但是,做这件事有什么不同之处:

#define MU_SUITE_START char *msg = NULL
Run Code Online (Sandbox Code Playgroud)

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

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

功能一样的宏

char *msg = __null;
Run Code Online (Sandbox Code Playgroud)

马尔科

char *msg = __null;
Run Code Online (Sandbox Code Playgroud)

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

#define PRINT_MSG() printf("This is the message\n")
Run Code Online (Sandbox Code Playgroud)

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

#define PRINT_MSG printf("This is the message\n")
Run Code Online (Sandbox Code Playgroud)

非常感谢任何建议,

Jon*_*ler 5

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

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

void somefunc(void)
{
    int OBJECT = 5;
    int FUNCTION = 10;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

这很少重要.然而,当它是,它真的很重要.

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

extern int isdigit(int c);
#define isdigit(c) ((c) >= '0' && (c) <= '9')
Run Code Online (Sandbox Code Playgroud)

并在实施文件中:

int (isdigit)(int c)
{
    assert((c >= 0 && c <= UCHAR_MAX) || c == EOF);
    return isdigit(c);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我是否忽略了什么,或者您对“OBJECT”和“FUNCTION”的定义完全相同吗? (2认同)