我有一个包含以下变量声明的头文件h1.h
:
h1.h
struct namespaces
{
char *soap_env;
char *soap_enc;
char *xsd;
char *xsi;
} ns;
我在两个C档h1.h
和c1.c
中加入了头文件c2.c
。
c1.c
#include "h1.h"
c2.c
#include "h1.h"
我希望在构建中出错,但我没有。在构建中没有错误和警告。
这是正常的吗?
当程序运行时,此类问题是否会导致未定义的行为?
答案 0 :(得分:5)
每个C源文件都由编译器单独处理,因此您不必担心两个不同的源文件包含相同的头文件。
如果尝试在单个源文件中包含相同的头文件,则会出现问题。这就是为什么在头文件中包含警卫(pragma或#ifndef ...
)是C编程中广泛采用的习惯用法。
答案 1 :(得分:2)
将要发生的另一个问题是c1.c和c2.c都将获得自己的ns。因此,如果修改它,其他人将看不到修改。一般来说,这不是人们想要的。
惯例是在一个c文件中定义ns,将其作为extern放在头文件中,并能够在其他c文件中使用它。