header 未看到宏

Macro not seen by header

如何将宏用作函数(在 header 中声明 - 源代码中的宏)? 我正在寻找这样的东西(除了这个不起作用)...

Foo.h:

#ifndef FOO_H
#define FOO_H

struct bar;

int bar_isEmpty(struct bar *b);

#endif /* !defined FOO_H */

Foo.c:

struct bar {
   size_t numElements;
};

#define bar_isEmpty(bar) {bar->numElements == 0}

如您所见,我不能将宏放在 header 中,因为那里没有定义结构。

如果您不想将 struct bar 暴露给对象外部,也没有办法使用后者(struct bar)将宏暴露给外部。

这是根据定义,因为宏只是一种文本替换,在编译所有宏扩展的结果之前应用


顺便说一句,在 C 中这个

int bar_isEmpty(bar *b);

不会编译,需要

int bar_isEmpty(struct bar *b);

您发布的代码存在一些问题。

首先,没有理由一开始就定义宏。您的 header 包含一个函数原型,表明 bar_isEmpty 应该被定义为一个函数。每个包含 header 文件的 c-file 都可以使用 bar_isEmpty,因此它应该被定义为一个函数。所以你的 c-file 应该看起来像:

#include <stddef.h>
#include "foo.h"

struct bar {
   size_t numElements;
};

int bar_isEmpty(struct bar* b) {
    return b->numElements == 0;
}

其次是您没有包含 foo.h(我已在上面更正)。第三是需要定义 size_t - 这可以通过包含 stddef.h 来完成(也在上面的示例中完成)。

将其定义为宏即可 如果您打算仅在 foo.c 中使用它,或者如果该结构已在 header 文件中完全定义.宏的实际定义是没有问题的,当你调用宏时问题就出现了。另一方面,在这种情况下,您可能不应该在 header 文件中提供原型。宏只是文本替换规则,因此您的宏定义错误,因为 bar_isEmpty(something) 会扩展为 { b->numElements == 0 },这在任何地方都不是有效语法。在这种情况下,正确的定义可能是:

#define bar_isEmpty(b) ((b)->numElements == 0)