编译引用一个头文件的两个C文件时出错“重复定义”

时间:2010-03-16 21:53:06

标签: c header definition

我有两个C文件和一个标题,如下所示:

头文件header.h:

char c = 0;

file1.c中:

#include "header.h"

file2.c中:

#include "header.h"

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

4 个答案:

答案 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,因此它可能无效所有