C++ ';标识符';已具有正文,但找不到标识符
我在VS2012中有一个使用预编译头的Qt项目(不确定这是否相关),它可以编译并正常工作。但是当我试图在QtCreator中编译同一个项目时,它显示出错误。首先,这两个项目相互对应,并且之前都进行了正确的配置(它们的编译和工作都很好)。然而,在对代码进行最新修改之后,出现了一些问题 错误:C++ ';标识符';已具有正文,但找不到标识符,c++,visual-studio-2012,compiler-errors,qt-creator,C++,Visual Studio 2012,Compiler Errors,Qt Creator,我在VS2012中有一个使用预编译头的Qt项目(不确定这是否相关),它可以编译并正常工作。但是当我试图在QtCreator中编译同一个项目时,它显示出错误。首先,这两个项目相互对应,并且之前都进行了正确的配置(它们的编译和工作都很好)。然而,在对代码进行最新修改之后,出现了一些问题 错误: pch.h:34: error:C2084: function 'void handleExceptionByShowingMessage(std::exception &)' already has
pch.h:34: error:C2084: function 'void handleExceptionByShowingMessage(std::exception &)' already has a body
main.cpp:16: error:C3861: 'handleExceptionByShowingMessage': identifier not found
使用pch.h中定义的另一个函数(也是内联函数)和一些其他cpp文件,这些操作将持续30多行。但所有的错误都是类似的
从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
有趣的注意-当我将这两个函数定义移动到一个虚拟头文件并将其包含在pch.h
中时,项目编译良好。如果代码在头文件中,您可以尝试静态内联
。
我不知道为什么
内联
并不意味着静态
,但我不久前也无意中发现了这一点。如果代码在标题中,您可以尝试静态内联
。
我不知道为什么inline
并不意味着static
,但我不久前也无意中发现了这一点。#pragma once
只会阻止包含指令的文件被多次包含。预编译头文件,pch.h
,在加载预编译头文件时包含,在编译文件时第二次包含。#pragma
指令将它们视为单独的文件,因此在这种情况下不起作用
pch.h
文件(或stdafx.h
)是一个优化文件,理想情况下不应包含源代码,而应仅包含到其他头文件的。那样的话,包括它几次将不会是一个问题
另一种解决方案是使用include保护(#ifndef PCH#define PCH#endif
),这将防止多次包含该文件。#pragma once
仅防止多次包含该指令的文件。预编译头文件,pch.h
,在加载预编译头文件时包含,在编译文件时第二次包含。#pragma
指令将它们视为单独的文件,因此在这种情况下不起作用
pch.h
文件(或stdafx.h
)是一个优化文件,理想情况下不应包含源代码,而应仅包含到其他头文件的。那样的话,包括它几次将不会是一个问题
另一种解决方案是使用include-guard(#ifndef-PCH#define-PCH#endif
),这将防止多次包含文件。您的PCH.h中是否有include-guard或#pragma?当然有。另外,请查看我的问题的更新。我怀疑pch.h
会被包含两次-一次是在加载预编译的头文件时,一次是在解析文件本身时,这一次#pragma once
不会再次保护。看起来是这样,但您知道可以做什么(除了使用伪头文件)?您可以尝试使用include-guard来代替(#ifndef-PCH#define-PCH#endif),但我认为您不应该在PCH中添加除#include之外的任何内容,因为它是一种优化,而不是源代码的一部分。您的PCH.h中有include-guard或#pragma吗?当然有。另外,请查看我的问题的更新。我怀疑pch.h
会被包含两次-一次是在加载预编译的头文件时,一次是在解析文件本身时,这一次#pragma once
不会再次保护。看起来是这样,但您知道可以做什么(除了使用伪头文件)?您可以尝试改用include-guard(#ifndef-PCH#define-PCH#endif),但我认为您不应该在PCH中添加除#include之外的任何内容,因为这是一种优化,而不是源代码的一部分。