gpt4 book ai didi

c++ - 'identifier' 已有正文但未找到标识符

转载 作者:行者123 更新时间:2023-11-28 00:44:38 24 4
gpt4 key购买 nike

我有一个在 VS2012 中使用预编译 header (不确定是否相关)的 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 实际上使用...)。

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

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

最佳答案

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

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

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

关于c++ - 'identifier' 已有正文但未找到标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16913752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com