抑制gcc警告:"warning: this is the location of the previous definition"

3

我需要一组包装标准系统调用(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: 警告:这是先前定义的位置

我该如何消除这些警告?

4个回答

5
包含保护放在头文件中。
基本上你需要在头文件开头加入这两行代码。
#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 是特定于您的代码的前缀。


很多遗留的源代码都使用这种技巧,特别是用自己的库函数替换标准库函数。例如golang.org源码中的lib9。如果有一个像-Wno-builtin-macro-redefined这样的命令行开关就好了,但我没有找到它。 - user222202

5

不要改动标准函数,而是重命名该函数:

#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/。使用相同的名称作为您的宏可能不是一个好主意!


0
将定义包装在:

中。
#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H

... your macro's

#endif

如果您在多个位置包含头文件,则可以确保宏仅定义一次。

对于头文件中的所有原型,这通常也是一个明智的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接