2009-04-20 160 views
2

我需要一套围绕标准系统调用的包装 - 打开,侦听等。 对于这些我有几个“#定义”为:抑制gcc警告:“警告:这是以前定义的位置”

#define open(a,b,c) JCL_Open(a,b,c) 

但是当我编译头和相关的.c文件,我得到以下警告:

/jcl_wrappers.h:114 :1:警告:“打开”重新定义
/jcl_wrappers.h:113:1:警告:这是以前定义的位置

如何禁用这些警告?

回答

5

include guards放在头文件中。

基本上你需要把这些两行头文件

#ifndef _yourincludefilename_h_ 
#define _yourincludefilename_h_ 

#endif /* _yourincludefilename_h_ */ 

年初在结束你的包含文件。

编辑:
rascher是正确的,开放不是一个宏的好名字,因为它会与库函数冲突。通常它是很好的C约定,使宏全部大写,所以我会建议您的宏更改为

#define OPEN(a,b,c) JCL_Open(a,b,c) 

甚至更​​好

#define XYZ_OPEN(a,b,c) JCL_Open(a,b,c) 

其中XYZ是特定于您的代码前缀。

+0

大量的遗留源代码使用这个技巧,特别是用它自己替换库函数。在golang.org资源中提供lib9来命名一个。有一个像-Wno-builtin-macro-redefined这样的命令行开关会很好。我也没有找到它。 – user222202 2011-08-23 15:54:27

0

裹的定义:

#ifndef JCL_WRAPPERS_H 
#define JCL_WRAPPERS_H 

... your macro's 

#endif 

这可以确保如果包括在多个地方你的头宏的只定义一次。

对于标题中的所有原型来说,这通常也是一件聪明的事情。

4

独自离开的标准功能和重命名功能:后来

#define myopen(a,b,c) JCL_Open(a,b,c) 

有人会感谢你的。

1

您可以尝试使用编译警卫。像:

my_headers.h:

#ifndef __MY_HEADERS 
#define __MY_HEADERS 

    #define open(a,b,c) JCL_Open(a,b,c) 

#endif 

这只会做做的是,如果 '__MY_HEADERS' 宏被定义的#ifndef和#endif之间。因此,.h文件中的所有内容只会被声明一次。

您可以使用相同的结构来查看“open”宏是否已经定义。

另外请注意,已经有一个名为open()的C函数:http://www.manpagez.com/man/2/open/。对你的宏使用相同的名字可能不是一个好主意!