(1)有些头文件重复引用,只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率就是很重要的了。
(2)有些头文件重复包含,会引起编译错误,比如在头文件中定义了全局变量或写了函数的实现而不是声明(虽然这种方式不被推荐,但确实是C规范允许的),这种会引起重复定义。
不是一定要加,但是不管怎样,用#ifndef/#define/#endif或者其他方式避免头文件重复包含,只有好处没有坏处。培养一个好的编程习惯是学习编程的一个重要分支。所以在写头文件时,最好是把内容都写在#ifndef和#endif之间。
若未定义XXX.h则这里就定义XXX.h,然后运行里面的内容,若下次还走到了这个文件,则进行#ifndef的判断,则#ifndef与#endif之间的内容不会再次被载入 但是,必须记住的是预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将减慢编译速度,所以如果可能,应该避免出现多重包含。
补充:
总结:
1. #ifndef,#define,#endif是C/C++语言中的宏定义, 通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,移植性好, 所以如果写的程序要跨平台,最好使用这种方式。但缺点是宏名字不能冲突。 2. #pragma 可以避免名字冲突,缺点就是如果某个头文件有多份拷贝, 本方法不能保证他们不被重复包含。且不是所有编译器都支持这种方式。 #include <stdio.h> #include <string.h> #define CHANG 0 int main(void) { char p[100]; scanf("%s",p); #if CHANG for (int x=0;x<strlen(p);x++){ if (p[x]=='z') putchar('a'); else putchar(p[x]+1); } #else puts(p); #endif return 0; }