检查多行宏是否已定义

3

我知道对于单行的宏定义,我们可以简单地使用

#ifndef X
#define X 10
#endif

然而我正在尝试使用多行宏完成相同的事情

#ifndef mallocErr(X)
#define mallocErr(X) \
    do { \
        if (X == NULL) { \
            perror("malloc"); \
            exit(EXIT_FAILURE); \
        } \
    } while (0) \
#endif

我确定我的问题是#ifndef mallocErr(X)的语法错误,但我似乎找不到正确的格式,或者我可能是错误的方法?

1个回答

3

这里有一些错误。

  1. 在检查标识符是否已定义时,不要包括宏的参数。
  2. 不要为您的#define转义最后一个换行符。
  3. 风格:通常最好将宏参数扩展括在括号内,以防提供表达式。例如使用(X)而不是X

解决所有这些问题会产生:

#ifndef mallocErr
#define mallocErr(X) \
    do { \
        if ((X) == NULL) { \
            perror("malloc"); \
            exit(EXIT_FAILURE); \
        } \
    } while (0)
#endif

我想指出,“多行宏”并没有什么固有的特殊之处。在这里,你所做的只是在换行符之前进行转义,以防止其被评估。这不是宏定义所特有的。

例如,下面的代码也是完全可以的:

#include <stdio.h>
int main(void)
{
    printf("Hello, \
world!\n");
    return 0;
}

甚至可以:

#include <stdio.h>
int main(void)
{
    p\
r\
i\
n\
t\
f("Hello, world!\n");
    return 0;
}

请注意,以上两个示例都不是一个好主意。我只是想说明换行符转义不仅仅是宏的一种语言特性。

我之前尝试了几种变化,我相信我的问题就是你在第二点指出的。很奇怪,但还是谢谢! - linegad
1
这应该不奇怪。如果你在 #endif 之前立即转义换行符,则 #endif 将附加到其前面的任何一行上。该语言要求预处理器语句必须出现在自己的一行上,因此你在这里存在冲突,你已经告诉编译器换行符不应被解释为换行符,但是你的眼睛告诉你的大脑那里有一个换行符。 - paddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接