【问题标题】:Error 'duplicate definition' when compiling two C files that reference one header file编译引用一个头文件的两个 C 文件时出现“重复定义”错误
【发布时间】:2010-03-16 21:53:05
【问题描述】:

我有两个C文件和一个头文件如下:

头文件header.h:

char c = 0;

file1.c:

#include "header.h"

file2.c:

#include "header.h"

我在编译时被警告过“重复定义”。我理解原因,因为变量 c 在 file1.c 和 file2.c 中定义了两次;但是,我确实需要在两个 c 文件中引用 header.h。我应该如何克服这个问题?

【问题讨论】:

    标签: c header definition


    【解决方案1】:

    首先,不要在标题中定义变量。在头文件中声明变量时使用extern 限定符,并在您的一个(不是两个)C 文件中定义它,如果您愿意,也可以在它自己的新文件中定义它。

    标题:

    extern char c;
    

    实现:

    #include <header.h>
    char c = 0;
    

    或者,您可以将定义保留在标题中,但添加static。使用static 将导致与上面示例中使用extern 不同的程序行为 - 所以要小心。如果您将其设为static,则包含标题的每个文件都将获得自己的c 副本。如果您使用extern,他们将共享一份。

    第二,防止双重包含:

    #ifndef HEADER_H
    #define HEADER_H
    
    ... header file contents ...
    
    #endif
    

    【讨论】:

      【解决方案2】:

      在您的标题中使用extern char c,并在您的.c 文件之一中使用char c = 0

      【讨论】:

        【解决方案3】:

        char c 是做什么用的?您可能希望它是 extern char c 或者如果您希望它成为每个编译单元(源文件)的单独变量,那么您应该使用 static char c

        【讨论】:

          【解决方案4】:

          如果您无法修改标头,那么作为 hack,在您的一个(但不是两个)源文件中,您可以这样做:

          #define c d
          #include "header.h"

          这将导致char c = 0; 变为char d = 0;,但当然,在任何其他使用c 的地方,它也会变为d,因此它可能根本不起作用。

          【讨论】:

          • +1 b/c 这太疯狂了,但是对于使用大量的第三方库调试嵌入式代码来说,这是一个非常有用的技巧!
          猜你喜欢
          • 2022-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          • 2021-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多