我需要一套围绕标准系统调用的包装 - 打开,侦听等。 对于这些我有几个“#定义”为:抑制gcc警告:“警告:这是以前定义的位置”
#define open(a,b,c) JCL_Open(a,b,c)
但是当我编译头和相关的.c文件,我得到以下警告:
/jcl_wrappers.h:114 :1:警告:“打开”重新定义
/jcl_wrappers.h:113:1:警告:这是以前定义的位置
如何禁用这些警告?
我需要一套围绕标准系统调用的包装 - 打开,侦听等。 对于这些我有几个“#定义”为:抑制gcc警告:“警告:这是以前定义的位置”
#define open(a,b,c) JCL_Open(a,b,c)
但是当我编译头和相关的.c文件,我得到以下警告:
/jcl_wrappers.h:114 :1:警告:“打开”重新定义
/jcl_wrappers.h:113:1:警告:这是以前定义的位置
如何禁用这些警告?
将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是特定于您的代码前缀。
裹的定义:
#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H
... your macro's
#endif
这可以确保如果包括在多个地方你的头宏的只定义一次。
对于标题中的所有原型来说,这通常也是一件聪明的事情。
独自离开的标准功能和重命名功能:后来
#define myopen(a,b,c) JCL_Open(a,b,c)
有人会感谢你的。
您可以尝试使用编译警卫。像:
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/。对你的宏使用相同的名字可能不是一个好主意!
大量的遗留源代码使用这个技巧,特别是用它自己替换库函数。在golang.org资源中提供lib9来命名一个。有一个像-Wno-builtin-macro-redefined这样的命令行开关会很好。我也没有找到它。 – user222202 2011-08-23 15:54:27