类似函数的宏与宏

gcc (GCC) 4.7.2 c89 

你好,

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

 #define MU_SUITE_START() char *msg = NULL 

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

 #define MU_SUITE_START char *msg = NULL 

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

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

function一样的宏

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

非常感谢任何建议,

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

 #define OBJECT char *msg1 = NULL #define FUNCTION() char *msg2 = NULL void somefunc(void) { int OBJECT = 5; int FUNCTION = 10; ... } 

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后面没有(但是函数内的宏被扩展。至少该函数是根据宏实现的,这几乎保证了相同的行为。