我有两个C文件和一个标题,如下所示:
头文件header.h:
char c = 0;
file1.c中:
#include "header.h"
file2.c中:
#include "header.h"
编译时我被警告'重复定义'。我理解原因,因为变量c在file1.c和file2.c中定义了两次;但是,我确实需要在两个c文件中引用header.h。我该如何克服这个问题?
答案 0 :(得分:14)
首先,不要在标题中定义变量。在头文件中声明变量时使用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
答案 1 :(得分:3)
在标题中使用extern char c
,在char c = 0
个文件中使用.c
。
答案 2 :(得分:0)
char c
用于什么?您可能希望它为extern char c
,或者如果您希望将此作为每个编译单元(源文件)的单独变量,那么您应该使用static char c
答案 3 :(得分:0)
如果您无法修改标题,那么在一个(但不是两个)源文件中,您可以执行此操作:
#define c d
#include "header.h"
这会导致char c = 0;
成为char d = 0;
,但当然,在使用c
的任何其他地方,它也会变为d
,因此它可能无效所有