压制gcc警告:“警告:这是前一个定义的位置”

时间:2009-04-20 05:03:40

标签: linux gcc-warning include-guards

我需要围绕标准系统调用的一组包装器 - 打开,监听等。 对于这些我有一些“#define”,如:

#define open(a,b,c) JCL_Open(a,b,c)

但是当我编译标题和相关的.c文件时,我收到以下警告:

/jcl_wrappers.h:114:1:警告:“打开”重新定义
/jcl_wrappers.h:113:1:警告:这是前一个定义的位置

我如何抑制这些警告?

4 个答案:

答案 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

如果您将标题包含在多个位置,这可以确保您的宏只定义一次。

对于标题中的所有原型,通常都是明智之举。