C ++是否包括所有包含在头文件中的头文件?

一个人零

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

testHeader.h:

void hello() {  }

file1.h:

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

file2.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的必要部分,则不能保证下一个版本将包含这些文件。

还值得注意的是,预处理器的include保护符(和/或#pragma once)几乎被普遍用来表示.h文件的内容不会被两次包含(按照惯例,这不能保证;对于写得不好的.h文件,或者为多个文件设计的怪异文件)包含在不同的预处理程序设置中,将不会被遵守);.cpp已经包含的标头中重新包含标头几乎没有成本.h在较早的编译器上,无论是否#pragma once对包含保护都没有特殊处理,它可能不得不第二次加载标头,查看保护并在第二个包含中不进行任何转储。许多较新的编译器都足够聪明,甚至可以避免这种花费。重点是,不要尝试通过避免冗余来进行优化#includes; 每个文件都应该具有该文件中#include使用的东西所需s的完整集合,不多也不少。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章