我需要一组围绕标准系统调用的包装器——open、listen 等。对于这些,我有一些“#define”,如:
#define open(a,b,c) JCL_Open(a,b,c)
但是当我编译头文件和相关的 .c 文件时,我收到以下警告:
/jcl_wrappers.h:114:1: warning: "open" redefined
/jcl_wrappers.h:113:1: warning: 这是之前定义的位置
我怎样才能抑制这些警告?
我需要一组围绕标准系统调用的包装器——open、listen 等。对于这些,我有一些“#define”,如:
#define open(a,b,c) JCL_Open(a,b,c)
但是当我编译头文件和相关的 .c 文件时,我收到以下警告:
/jcl_wrappers.h:114:1: warning: "open" redefined
/jcl_wrappers.h:113:1: warning: 这是之前定义的位置
我怎样才能抑制这些警告?
在你的头文件中加入包含守卫。
基本上你需要把这两行放在你的头文件的开头
#ifndef _yourincludefilename_h_
#define _yourincludefilename_h_
和
#endif /* _yourincludefilename_h_ */
最后包含文件。
编辑:
rascher 是对的,open 对宏来说不是一个好名字,因为它会与库函数冲突。通常将宏全部大写是很好的 C 约定,所以我建议将宏更改为
#define OPEN(a,b,c) JCL_Open(a,b,c)
甚至更好
#define XYZ_OPEN(a,b,c) JCL_Open(a,b,c)
其中 XYZ 是特定于您的代码的前缀。
保留标准函数并重命名函数:
#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/。为宏使用相同的名称可能不是一个好主意!
将定义包装在:
#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H
... your macro's
#endif
如果您在多个位置包含标题,这可以确保您的宏只定义一次。
对于标题中的所有原型,这通常也是一件明智的事情。