【问题标题】:Are header files not compiled (C++ Visual Studio 2015)是否未编译头文件(C++ Visual Studio 2015)
【发布时间】:2016-11-23 22:25:04
【问题描述】:

只是为了看看它是否可以工作(我知道它的形式很糟糕),我在头文件中完全定义了一个函数,并在主 cpp 文件中为所述函数做出了相应的前向声明。 C++ 函数不需要在它们使用的翻译单元中定义,因此为什么头文件几乎完全只是前向声明(内联函数除外)。但是,当我尝试编译这个项目时,它说有未解决的外部。

当我将头文件的全部内容移动到源文件中时(也删除了头文件),它编译得很好并按预期执行。那么,是不是在构建项目时只是没有编译头文件,还是只是有一些我不知道的异常?

此外,即使我只是在属性资源管理器中转到头文件的属性并将其 File Type 设置为 C/C++ Code 并将其扩展名更改为 .cpp,它仍然无法编译(即使如果我只需删除它并创建一个新的源文件,我认为这是最奇怪的部分)。

(我正在使用已禁用的扩展程序 /Za,如果这有任何改变)

这是代码文件

//main.cpp
void foo();

void main()
{
    foo();
}

还有头文件

//test.h
#include <iostream>

void foo()
{
    std::cout << 'a';
}

【问题讨论】:

  • 除非通过 #include 预处理将头文件拉入翻译单元,否则不会编译头文件。由于您唯一的 .cpp 文件没有此类包含,因此未编译它,因此该(显然是您唯一的)翻译单元无法使用其中的任何内容。

标签: c++ visual-studio-2015


【解决方案1】:

头文件被预处理器包含到编译单元 - cpp 文件中。之后编译器只编译cpp文件中的源代码。

当您将函数定义放入标头 .h 文件中时。您没有将此头文件包含在main.cpp 中,并且编译器不会编译它,因为预处理器没有将它包含在main.cpp 中。

您可以自己查看预处理器作业的结果。在 Visual Studio 中,使用 Preprocessor 属性页上的 /P 选项。对于main.cpp,输出将在main.i

【讨论】:

    【解决方案2】:

    头文件不是自己编译的,想象一下文本实际上是在包含它的 .cpp 文件中。这个新的“合并”文件就是编译的。因此,您可以将函数放在头文件中,当它包含在 .cpp 文件中时将被编译。

    它不好的原因是,如果你将它包含在第二个 .cpp 文件中,它会尝试再次编译,你会遇到问题。

    【讨论】:

      【解决方案3】:

      标题中函数定义的问题不在于它们被跳过。真正的风险是它们被编译了两次,而这一次太多了。 C++ 有一个叫做单一定义规则的东西,而你通过编译一个函数两次就违反了这个规则。

      有一个重要的例外需要提及:inline 函数是例外的,可以在每个翻译单元中定义。

      【讨论】:

        猜你喜欢
        • 2016-10-25
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多