【问题标题】:suppress gcc warnings : "warning: this is the location of the previous definition"抑制 gcc 警告:“警告:这是先前定义的位置”
【发布时间】:2009-04-20 05:03:40
【问题描述】:

我需要一组围绕标准系统调用的包装器——open、listen 等。 对于这些,我有一些“#define”,如下所示:

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

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

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

如何抑制这些警告?

【问题讨论】:

    标签: linux gcc-warning include-guards


    【解决方案1】:

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

    【讨论】:

    • 很多遗留源代码都使用这个技巧,特别是用自己的库函数替换库函数。 golang.org 来源中的 lib9 就是其中之一。最好有一个像 -Wno-builtin-macro-redefined 这样的命令行开关。我也没找到。
    【解决方案2】:

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

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

    以后有人会感谢你的。

    【讨论】:

      【解决方案3】:

      您可以尝试使用编译防护。喜欢:

      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(): http://www.manpagez.com/man/2/open/ 的 C 函数。为宏使用相同的名称可能不是一个好主意!

      【讨论】:

        【解决方案4】:

        将定义包装在:

        #ifndef JCL_WRAPPERS_H
        #define JCL_WRAPPERS_H
        
        ... your macro's
        
        #endif
        

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

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

        【讨论】:

          猜你喜欢
          • 2012-10-02
          • 1970-01-01
          • 2011-12-28
          • 2015-08-01
          • 1970-01-01
          • 2011-03-31
          • 2019-10-22
          • 2014-12-19
          • 2021-12-27
          相关资源
          最近更新 更多