不止一次包含头文件

时间:2011-01-21 03:24:29

标签: c header-files

#include <stdio.h>
#include <stdio.h>

int main ()
{
   printf ("hello world");
   return 0;
}

当我编译它时,编译器不会给包含stdio.h两次的任何警告/错误。为什么会这样?现在声明和定义函数scanfprintf等不是两次吗?

先谢谢

4 个答案:

答案 0 :(得分:11)

通常,头文件的编写类似于以下示例,以防止出现此问题:

#ifndef MYHEADER
#define MYHEADER

...


#endif

然后,如果包含多次,则第二个实例会跳过内容。

答案 1 :(得分:2)

除了Mark Tolonen's answer所指出的使用包含保护之外,只要声明兼容,就可以多次声明一个函数。这非常好:

int foo(int, char *);
int foo(int a, char *p);
extern int foo(int x, char y[]);

事实上,由于每个定义都是一个声明,每当你“转发声明”在同一个文件中声明的函数时,你就会声明该函数两次。

什么是确定是创建一个函数的多个外部定义;但是编写良好的头文件不应该创建外部定义 - 只有声明。 printfscanf函数的(单个)定义应该在一个目标文件中,该文件在构建时与程序链接。

答案 2 :(得分:0)

不,头文件通常定义一个标志,然后只有在标志未定义的情况下才使用#ifndef来包含它们。

打开一个,看看。

答案 3 :(得分:-4)

顺便说一句,做“#ifndef”技巧适合其他人使用的标题(比如标准标题)。

如果你需要#ifndef作为“私人”程序,那么你做的是“错误的”。也就是说,您可以并且应该在项目中组织标题,这样它们就不会被包含多次。

这有用的一个原因是保留您认为已删除的标题不会再次弹出。

由于您无法控制公共标头的使用方式,因此对于公共标头,此技巧是合理的。私有标题完全没有这个技巧。