2016-03-19 59 views
0

我如何使用宏作为函数(声明在头 - 源宏)? 我正在寻找这样的事情(除了这一个不工作)...宏没有看到标题

了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} 

正如你所看到的,我不能把宏放在标题中,因为结构没有在那里定义。

+1

您能否提供_“does not work”_的定义? –

+0

我想你不能做这样的事情。为什么不在头文件中定义宏或定义普通函数是源文件? – MikeCAT

+0

为什么不把结构和宏移动到头文件? –

回答

1

如果您不想将struct bar暴露在对象之外,那么也无法使用后者向外部展示marco(struct bar)。

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


BTW,在C这个

int bar_isEmpty(bar *b); 

不会编译并需要

int bar_isEmpty(struct bar *b); 
+0

谢谢,那就是我一直在寻找的。缺少的* struct *虽然是一个错误。将解决。 – LastSecondsToLive

2

有你贴的代码的几个问题。

首先,没有什么理由首先定义宏。您的标题包含一个函数的原型,并且表示bar_isEmpty应该被定义为一个函数。每个包含头文件的c文件都可以使用bar_isEmpty,因此它应该被定义为一个函数。所以,你的c文件应该是这个样子:

#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中使用它,或者在头文件中完全定义了结构。宏的实际定义没有问题,调用宏时会出现问题。另一方面,在这种情况下,你可能不应该在头文件中提供一个原型。宏只是文本替换的一个规则,因此您的宏被严重定义为bar_isEmpty(something)会扩展为{ b->numElements == 0 },这在任何地方都是无效的语法。在这种情况下,正确的定义可能是:

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