3

我需要一组围绕标准系统调用的包装器——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: 这是之前定义的位置

我怎样才能抑制这些警告?

4

4 回答 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 是特定于您的代码的前缀。

于 2009-04-20T05:07:45.657 回答
5

保留标准函数并重命名函数:

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

以后有人会感谢你的。

于 2009-04-20T05:09:04.140 回答
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/。为宏使用相同的名称可能不是一个好主意!

于 2009-04-20T05:10:18.647 回答
0

将定义包装在:

#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H

... your macro's

#endif

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

对于标题中的所有原型,这通常也是一件明智的事情。

于 2009-04-20T05:08:00.180 回答