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)
如何将宏用作函数(在 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)