头文件的包含
本地⽂件包含
#include "filename"
查找策略:先在源⽂件所在⽬录下查找,如果该头⽂件未找到,编译器就像查找库函数头⽂件⼀样在
标准位置查找头⽂件。
如果找不到就提⽰编译错误。
Linux环境的标准头⽂件的路径:
1 /usr/include
VS环境的标准头⽂件的路径:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
//这是VS2013的默认路径
库⽂件包含
1 #include <filename.h>
查找头⽂件直接去标准路径下去查
找,如果找不到就提⽰编译错误。
这样是不是可以说,对于库⽂件也可以使⽤ “” 的形式包含?
答案是肯定的,可以,但是这样做查找的效率就低些,当然这样也不容易区分是库⽂件还是本地⽂件 了。
总结
“”双引号 先去文件找,找不到去标准头文件里面去找(范围较大)
<>直接去标准库文件里面去查找
分开定义的目的是效率比较高
———————————————————————————————————————————
如何防止头文件多次引入
这里就是头文件包含五次,我们需要知道头文件是不能相互包含的
如何解决这个问题
#pragma()
这个是默认对齐数
#pragma once(解决方式1)
`#pragma once` 是一个编译器指令,它告诉编译器在包含文件的任何地方只包含该文件一次,即它实现了文件级别的重复包含保护。这个指令被广泛支持,但并非所有编译器都必须遵守。
在 C 和 C++ 编程中,头文件通常包含宏定义、函数原型和类声明等,这些内容在被多个源文件包含时可能会被多次编译,导致代码冗余和可能的冲突。
使用 `#pragma once` 可以避免这种情况。
当编译器遇到 `#pragma once` 指令时,它会检查该文件是否已经被包含过。如果文件尚未被包含,编译器将继续包含该文件并继续编译;如果文件已经被包含,编译器将忽略该文件,不会重复包含。
这里有一个简单的例子:
// header.h
#pragma once
// 一些宏定义和函数原型
#define MY_MACRO 1
void function();
// main.c
#include "header.h"
int main() {// 使用宏和函数printf("%d\n", MY_MACRO);function();// header.h 不会被重复包含#include "header.h"// 这里不会引起编译错误,因为 header.h 已经被包含过了
}
在这个例子中,`header.h` 文件中包含了 `#pragma once` 指令。当 `main.c` 文件包含 `header.h` 时,`#pragma once` 确保了 `header.h` 中的内容不会因为多次包含而重复编译。因此,即使 `#include "header.h"` 在 `main.c` 文件中被重复写了一次,它也不会对 `header.h` 产生第二次包含的效果。
需要注意的是,`#pragma once` 并不是 C 或 C++ 标准的一部分,它的支持取决于具体的编译器。然而,由于它非常简单且易于实现,大多数现代编译器都支持这个指令。
#ifndef +#define解决方式2
每个头⽂件的开头写:
#ifndef __TEST_H__
#define __TEST_H__
//头⽂件的内容
#endif //__TEST_H__
什么意思呢,也就是首先我们判断
1,宏是否被定义没有则继续执行
2,宏是否被定义,定义了则不执行
补充说明
#ifdef
指令检查是否已经定义了某个宏。如果该宏已定义,则执行#ifdef
和相应的#endif
指令之间的代码。#ifndef
指令检查是否没有定义某个宏。如果没有定义该宏,则执行#ifndef
和相应的#endif
指令之间的代码。