0

我在 VS2012 中有一个使用预编译头文件(不确定是否相关)的 Qt 项目,它可以编译并且工作正常。但是当我尝试在 QtCreator 中编译同一个项目时,它会显示错误。首先 - 两个项目相互对应,并且之前已正确配置(它们编译并工作得很好)。然而,在对代码进行最新更改后,出现了问题。

错误:

pch.h:34: error:C2084: function 'void handleExceptionByShowingMessage(std::exception &)' already has a body
main.cpp:16: error:C3861: 'handleExceptionByShowingMessage': identifier not found

这些持续了 30 多行,在 pch.h 中定义了另一个函数(也是内联的)和更多的 cpp 文件。但是所有的错误都是类比的。

来自pch.h

inline void handleExceptionByShowingMessage(std::exception &e)
{
    QMessageBox msgBox;
    msgBox.setText(QString::fromUtf16((ushort*)e.what()));
    msgBox.setStandardButtons(QMessageBox::Discard);
    msgBox.setIcon(QMessageBox::Warning);
    int ret = msgBox.exec();
}

我不粘贴cpp文件中的函数调用,因为它只是一种常规用途。所有cpp文件都pch.h正确包含(第一行代码),正如我所说 - 完全相同的代码和文件结构在 VS2012 中工作(我相信 QtCreator 的编译器实际上使用......)。

如果您需要更多代码/信息,请告诉我。

更新: 是的,所有标题都有#pragma once. 不过有趣的通知- 当我将这两个函数定义移动到一个虚拟头文件并将其包含在 中时pch.h,项目编译得很好。

4

2 回答 2

2

#pragma once只防止包含该指令的文件被多次包含。您预编译的头文件,pch.h,在加载预编译的头文件时被包含在内,并且在您的文件被编译时第二次包含在内。该#pragma指令将它们视为单独的文件,因此它在这种情况下不起作用。

pch.h文件(或stdafx.h)是一种优化,理想情况下不应包含源代码,而应仅包含#includes其他头文件。这样,多次包含它就不会成为问题。

另一种解决方案是使用包含保护 ( #ifndef PCH #define PCH #endif),这将防止文件被多次包含。

于 2013-06-04T16:19:44.727 回答
1

static inline如果代码在标题中,您可以尝试。我不知道为什么inline不暗示static,但我前一段时间也偶然发现了这一点。

于 2013-06-04T14:36:30.370 回答