在2个c文件中包含头文件(包含变量定义)时没有构建错误

时间:2014-05-29 08:52:34

标签: c++ c compilation

我有一个包含以下变量声明的头文件h1.h

h1.h

struct namespaces
{
    char *soap_env;
    char *soap_enc;
    char *xsd;
    char *xsi;
} ns;

我在两个C档h1.hc1.c中加入了头文件c2.c

c1.c

#include "h1.h"

c2.c

#include "h1.h"

我希望在构建中出错,但我没有。在构建中没有错误和警告。

这是正常的吗?

当程序运行时,此类问题是否会导致未定义的行为?

2 个答案:

答案 0 :(得分:5)

每个C源文件都由编译器单独处理,因此您不必担心两个不同的源文件包含相同的头文件。

如果尝试在单个源文件中包含相同的头文件,则会出现问题。这就是为什么在头文件中包含警卫(pragma或#ifndef ...)是C编程中广泛采用的习惯用法。

答案 1 :(得分:2)

将要发生的另一个问题是c1.c和c2.c都将获得自己的ns。因此,如果修改它,其他人将看不到修改。一般来说,这不是人们想要的。

惯例是在一个c文件中定义ns,将其作为extern放在头文件中,并能够在其他c文件中使用它。