【发布时间】:2016-01-06 09:40:26
【问题描述】:
我试图了解包含文件的多个定义实际上是如何协作的,有时是如何冲突的。所以我有一个自定义头文件file.h,其中一些函数在#include guard 中声明。示例:
#ifndef FILE_Ariew7OGJknw00
#define FILE_Ariew7OGJknw00
#include <stdlib.h> //assume minimal
//interfaces of functions
#endif
现在我有几个问题。
1. 由于#include <stdlib.h> 已经包含在标题file.h 中,我不需要将它包含在我的file.c 中。因为file.c 包括file.h,其中包括stdlib.h。但是,当我在file.h 之后在.c 中包含<stdlib.h> 时,它仍然可以正常工作。为什么呢?喜欢:
#include <stdio.h>
#include "file.h"
#include <stdlib.h>
//code
2.如果我这样做会发生什么:
#include <stdio.h>
#include <stdlib.h>
#include "file.h"
//code
实际上什么都没有,但为什么不跳过 file.h 定义(或者是吗?)基于守卫,因为库 stdlib 是 已经包括在内。
最后,一个更普遍的问题:为什么#include 守卫比#pragma once 使用更广泛,尽管后者有几个优点,例如:
• 更少的代码
• 避免名称冲突(即FILE_Ariew7OGJknw00)
• 提高编译速度
【问题讨论】:
-
标头不是库。而且 C 不声明库,而是声明函数和变量并定义类型。
-
@Olaf 是的。我编辑了它。
标签: c include header-files pragma include-guards