C++是否包含包含的头文件包含的所有头文件?
在此示例代码中,我有 3 个文件:
testHeader.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.hincludestestHeader.h和file2.hincludes file1.h,dotestHeader.h和它的函数在file2.h? 怎么样<iostream>和它的功能是什么?
回答
除非被预处理器以奇怪的方式保护,是的,你得到了它们。#include主要是预处理器技巧,大致相当于将包含的文本转储到源代码中,并且它是可传递的;如果您#include <a.h>,您将在一次通过中获得 的扩展形式a.h,包括其所有包含的预处理器扩展形式,其所有包含等,等等。
请注意,明确包含您直接依赖的所有内容仍然是一个好主意;当然,其他.h文件#include <vector>今天可能会出现,但如果它们不是公开的 API 的必要部分,则不能保证下一个版本会有它们。
还值得注意的是,预处理器包含警卫(和/或#pragma once)几乎普遍用于表示.h文件的内容不会被包含两次(按照惯例,不是保证;在写得不好的.h文件的情况下,或者为多个设计的奇怪文件)包含不同的预处理器设置,它不会被遵守);重新包含.cpp已从.h您包含的标题中获得的标题几乎没有成本。在较旧的编译器上,没有#pragma once或没有对包含保护的特殊处理,它可能必须第二次加载头文件,查看保护,并且在第二个包含上不转储任何内容;许多较新的编译器足够聪明,甚至可以避免这种成本。重点是,不要试图通过避免冗余来优化#includes; 每个文件都应该具有该文件中#include使用的东西所需的完整集合,不多也不少。