1

我在 VS2012 中有一个使用预编译头文件的非常基本的项目。我知道我应该将所有“常见”包含添加到 stdafx.h 并且我需要将其包含在每个 .cpp 文件中。因此,基本设置如下所示:

富.h:

#ifndef FOO_H
#define FOO_H

class Foo {

public:
    Foo();
    ~Foo();

    void do(string str);
};
#endif

Foo.c:

#include "stdafx.h"
#include "Foo.h"

void Foo::do(string str) {}

在 stdafx.h 中:

#include <string>
using namespace std;

如果没有预编译的头文件,我会放入#include <string>foo.h,因为它必须知道string. string但是这个 foo.h在这个设置中是怎么知道的呢?(请注意,stdafx.h 仅包含在 .cpp 文件中)。

注意:我有一个使用预编译头文件的工作示例;问题是它是如何工作的。

4

2 回答 2

2

这是因为编译器按照它们在主编译单元中出现的顺序处理头文件。

因为.cpp文件包含<string>(间接通过"stdafx.h"),<string>所以编译器知道其中的内容,并且可以被后面的代码使用,甚至是从头文件中提取的代码。

但是它很脆弱,因为在没有首先包含的情况下包含头文件<string>会导致错误。

于 2013-03-27T13:47:38.743 回答
1

您可以将预编译的标头视为头文件的一种缓存。编译器在第一次遇到一组头文件时(通常在编译 stdafx.cpp 时)对其进行分析,编译它们,然后为任何需要它们的模块准备好结果。

于 2013-03-27T13:54:45.583 回答