我需要一组包装标准系统调用(open、listen等)的函数。
对于这些函数,我有一些“#define”,如下:
#define open(a,b,c) JCL_Open(a,b,c)
但是当我编译头文件和相关的.c文件时,我收到了以下警告:
/jcl_wrappers.h:114:1: 警告:重新定义“open”
/jcl_wrappers.h:113:1: 警告:这是先前定义的位置
我该如何消除这些警告?
我需要一组包装标准系统调用(open、listen等)的函数。
对于这些函数,我有一些“#define”,如下:
#define open(a,b,c) JCL_Open(a,b,c)
但是当我编译头文件和相关的.c文件时,我收到了以下警告:
/jcl_wrappers.h:114:1: 警告:重新定义“open”
/jcl_wrappers.h:113:1: 警告:这是先前定义的位置
我该如何消除这些警告?
#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
如果您在多个位置包含头文件,则可以确保宏仅定义一次。
对于头文件中的所有原型,这通常也是一个明智的做法。