在此示例代码中,我有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.h
和file2.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
对包含保护都没有特殊处理,它可能不得不第二次加载标头,查看保护并在第二个包含中不进行任何转储。许多较新的编译器都足够聪明,甚至可以避免这种花费。重点是,不要尝试通过避免冗余来进行优化#include
s; 每个文件都应该具有该文件中#include
使用的东西所需的s的完整集合,不多也不少。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句