gpt4 book ai didi

c - 类函数宏与宏

转载 作者:行者123 更新时间:2023-12-02 22:19:59 26 4
gpt4 key购买 nike

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;

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

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

关于c - 类函数宏与宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13872318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com