在任意C语言标准下,能否将所有头文件包含移至源文件中?
关于头文件包含位置的问题解答
结论:不能这么做
不管是哪个版本的C语言标准,都不能只把<stdint.h>的包含语句放在sum.c里,而不在sum.h中声明。
为什么不行?
sum.h里的函数声明用到了uint16_t这个类型,而uint16_t是在<stdint.h>里定义的。如果sum.h里不包含<stdint.h>,当其他源文件(比如main.c)包含sum.h时,编译器处理uint16_t sum(uint16_t a, uint16_t b);这句声明时,根本识别不了uint16_t,直接会报“未知类型名”的编译错误。
头文件的基本要求就是自包含——只要某个源文件包含了这个头文件,就能直接编译通过,不需要额外先包含别的头文件。要是依赖的头文件只在源文件里包含,那所有使用这个模块的代码都得手动先包含一遍<stdint.h>,既麻烦又容易出错。
正确的做法
必须在sum.h里包含<stdint.h>,同时加上头文件保护防止重复包含:
#ifndef SUM_H #define SUM_H #include <stdint.h> uint16_t sum(uint16_t a, uint16_t b); // 其他数值类型的求和函数声明 #endif // SUM_H
至于sum.c,只要包含自己的头文件sum.h就行,<stdint.h>会被间接包含进来,当然你也可以单独再写一遍<stdint.h>的包含语句,不过没必要。
内容的提问来源于stack exchange,提问作者abdo raqi
相关产品推荐
相关产品推荐

