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")
非常感谢任何建议,
答案 0 :(得分:5)
类似对象和类似函数的宏之间存在一个区别:
#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
后面没有(
,但函数内的宏被扩展。至少该函数是根据宏实现的,这几乎可以保证相同的行为。