gpt4 book ai didi

c++ - C++ 是否包含包含的头文件包含的所有头文件?

转载 作者:行者123 更新时间:2023-12-05 08:37:24 28 4
gpt4 key购买 nike

在这个示例代码中,我有 3 个文件:

测试头.h:

void hello() {  }

文件1.h:

#include "testHeader.h"
#include <iostream>
void sayHi() { std::cout << "hi" << std::endl; }

文件2.h:

#include "file1.h"
void sayHello() { std::cout << "hello" << std::endl; }

如果file1.h包括 testHeader.hfile2.h包括 file1.h , 做 testHeader.h其功能可在 file2.h 中访问?怎么样<iostream>及其功能?

最佳答案

除非以奇怪的方式受到预处理器守卫的保护,是的,你得到它们。 #include很大程度上是一个预处理器技巧,大致相当于将包含的文本转储到源代码中,并且它是可传递的;如果你#include <a.h> ,你得到 a.h 的扩展形式,包括它的所有包含的预处理器扩展形式,它们的所有包含等等,无限循环,在一次通过中。

请注意,显式包含您直接依赖的所有内容仍然是一个好主意;当然,另一个 .h文件可能 #include <vector>今天,但如果它们不是公开的 API 的必要部分,则不能保证下一个版本会有它们。

还值得注意的是,预处理器包含保护(和/或 #pragma once)几乎普遍用于表示 .h。文件的内容不会被包含两次(按照惯例,不是保证;在写得不好的情况下 .h 文件,或者设计用于多次包含不同预处理器设置的奇怪文件将不会被遵守);在 .cpp 中重新包含 header 几乎没有成本它已经从 .h 得到你包括在内。在旧的编译器上,没有 #pragma once并且没有对包含守卫的特殊处理,它可能必须第二次加载 header ,查看守卫,并且在第二次包含时不转储任何内容;许多较新的编译器足够聪明,甚至可以避免这种成本。重点是,不要试图通过避免冗余来优化 #include ;每个文件都应该有完整的 #include该文件中使用的东西需要它,不多也不少。

关于c++ - C++ 是否包含包含的头文件包含的所有头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65671078/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com