#include <stdio.h>
#include <stdio.h>
int main ()
{
printf ("hello world");
return 0;
}
当我编译它时,编译器不会给包含stdio.h
两次的任何警告/错误。为什么会这样?现在声明和定义函数scanf
,printf
等不是两次吗?
先谢谢
答案 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[]);
事实上,由于每个定义都是一个声明,每当你“转发声明”在同一个文件中声明的函数时,你就会声明该函数两次。
什么是不确定是创建一个函数的多个外部定义;但是编写良好的头文件不应该创建外部定义 - 只有声明。 printf
和scanf
函数的(单个)定义应该在一个目标文件中,该文件在构建时与程序链接。
答案 2 :(得分:0)
不,头文件通常定义一个标志,然后只有在标志未定义的情况下才使用#ifndef
来包含它们。
打开一个,看看。
答案 3 :(得分:-4)
顺便说一句,做“#ifndef”技巧适合其他人使用的标题(比如标准标题)。
如果你需要#ifndef作为“私人”程序,那么你做的是“错误的”。也就是说,您可以并且应该在项目中组织标题,这样它们就不会被包含多次。
这有用的一个原因是保留您认为已删除的标题不会再次弹出。
由于您无法控制公共标头的使用方式,因此对于公共标头,此技巧是合理的。私有标题完全没有这个技巧。