如果一个项目有一个包含第二个标题的标题,并且它们都包含一个公共标题,那么从第一个标题中删除包含公共标题并依赖于通过第二个标题的间接包含是不错的做法?
例如为:
我知道可以从stdint.h
删除temperature.h
,但应该吗?
在temperature.h
:
#include <stdint.h> // *Should* this include be removed in this case.
#include "i2c.h"
extern uint16_t temperatureRead (i2cData_t x);
在i2c.h
:
#include <stdint.h>
typedef struct i2cData_t {
uint16_t exampleMember
} i2cData_t;
答案 0 :(得分:3)
通常,您希望模块是自包含的。如果您的模块依赖于标题中的内容,则将其包含在内。 Temperature.h可能有一天决定它不再需要包含stdint.h并将其删除。您的代码应与该决定无关,因此请通过包含stdint.h来保护它,即自包含。
使用标题保护(或C ++编译指示一次)以确保编译速度不会因为多次包含标题而降级。
答案 1 :(得分:2)
始终假设模块是独立的。在上面的例子中,temperature.h需要来自stdint.h和i2c.h的东西,所以就这样吧。如果重构发生且i2c.h不再包含stdint.h,则可以避免编译问题。修复一个小项目很简单,但不是很大。
答案 2 :(得分:2)
我知道stdint.h可以从temperature.h中删除,但应该是吗?
每个源文件都应包含它明确要求的标头。在已发布的案例中,如果exampleMember
的类型更改为int
且ic2.h
不再包含stdint.h
,那么temperature.h
的补充将失败,即使其来源不变。或者,如果其他源文件使用temperature.h
,那么其他源文件必须包含stdint.h
才能成功完成补充。