Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ';标识符';已具有正文,但找不到标识符_C++_Visual Studio 2012_Compiler Errors_Qt Creator - Fatal编程技术网

C++ ';标识符';已具有正文,但找不到标识符

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

我在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
使用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之外的任何内容,因为这是一种优化,而不是源代码的一部分。