我需要围绕标准系统调用的一组包装器 - 打开,监听等。 对于这些我有一些“#define”,如:
#define open(a,b,c) JCL_Open(a,b,c)
但是当我编译标题和相关的.c文件时,我收到以下警告:
/jcl_wrappers.h:114:1:警告:“打开”重新定义
/jcl_wrappers.h:113:1:警告:这是前一个定义的位置
我如何抑制这些警告?
答案 0 :(得分:5)
将include guards放入您的标头文件中。
基本上你需要将这两行放在头文件的开头
#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是特定于您的代码的前缀。
答案 1 :(得分:5)
单独保留标准功能并重命名功能:
#define myopen(a,b,c) JCL_Open(a,b,c)
有人会在以后感谢你。
答案 2 :(得分: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/。为宏使用相同的名称可能不是一个好主意!
答案 3 :(得分:0)
将定义包装在:
#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H
... your macro's
#endif
如果您将标题包含在多个位置,这可以确保您的宏只定义一次。
对于标题中的所有原型,通常都是明智之举。