Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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 2010 - Fatal编程技术网

C++ 包含预编译标头时出错

C++ 包含预编译标头时出错,c++,visual-studio-2010,C++,Visual Studio 2010,我正在使用Windows7上的VisualStudio2010为控制台应用程序编写代码。我已经包括了在本程序中使用的库,但是当我仅使用头文件构建程序时,它无法包括“stdafx.h”头文件。这是我的密码 #include "stdafx.h" #include "stgetriggersample.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } 我得到这个错误: error C1189: #error : "include

我正在使用Windows7上的VisualStudio2010为控制台应用程序编写代码。我已经包括了在本程序中使用的库,但是当我仅使用头文件构建程序时,它无法包括“stdafx.h”头文件。这是我的密码

#include "stdafx.h"
#include "stgetriggersample.h"

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
我得到这个错误:

error C1189: #error :  "include 'stdafx.h' before including this file for PCH"
“stdafx.h”头文件存在于我的当前目录中

更新stgetriggersample.h”的内容是

stdafx.h”的内容是:

//stdafx.h:标准系统包含文件的包含文件,
//或特定于项目的包含经常使用的文件,但
//变化不大
//
#布拉格语一次
#包括“targetver.h”
#包括
#包括
//TODO:在此处引用程序所需的其他标题
我尝试使用选项编写代码,但没有使用预编译头,但仍然得到相同的错误


如何纠正这一点。谢谢

也许你一直在努力解决这个问题,事实上,你弄坏了什么东西。让我们了解一下Visual Studio中预编译头用法的正确配置(我将使用VS2012中的选项名称):

  • 启用PCH:Project Properties->
    配置属性的使用
    ->
    C/C++
    ->
    预编译头
    ->
    预编译头
    ->
    使用(/Yu)

  • 设置预编译头的名称:项目属性->
    配置属性->
    C/C++
    ->
    预编译头
    ->
    预编译头文件
    。在您的例子中,您应该看到标准的PCH名称(
    stdafx.h
    )。如果你愿意,你可以改变

  • (事实上,最重要的一步)启用PCH生成:标头是不够的。您还需要一个负责PCH内容生成的
    .cpp
    文件(因为只能编译源文件)。在您的情况下,您的项目附加了默认的
    stdafx.cpp
    。用RMB点击它,然后:
    配置属性
    ->
    C/C++
    ->
    预编译头
    ->
    预编译头
    ->
    创建(/Yc)

  • 从现在起,附加到项目的每个源文件(包括步骤3中负责PCH生成的源文件)的第一个非空行应如下所示:

    #include "PCH_NAME"
    
    其中,
    PCH\u NAME
    是步骤2中设置的预编译头的名称

    以这种方式设置所有这些设置后,我建议您:

  • 清洗你的溶液
  • 签入
    输出目录
    中间目录
    的项目属性路径。删除它们(我希望它们不包含任何代码-它们不应该)
  • 在解决方案文件夹(*)中,您还应该看到名称为:
    your solution name-cc50b4e6
    的文件夹。删除它
  • 这将完全重置您的解决方案(包括IntelliSense数据库等)。然后,打开项目并编译它

    (*)-在解决方案文件夹中,默认情况下,。如果您设置了有效的
    后备位置,它将被放置在那里。

    在代码中:

    #ifndef __AFXWIN_H__
        #include"stdafx.h"
        #error "include 'stdafx.h' before including this file for PCH"
    #endif
    
    看起来StGETriggerSample.h正在检查stdafx.h是否已通过查找编译保护宏AFXWIN_h_____包含在内。然而,stdafx.h实际上并没有定义这个guard宏,它只是依赖station“#pragma once”来避免多个包含项。因此,即使包含stdafx.h,也将始终触发#error语句

    要修复此问题,请添加编译保护

    #ifndef __STDAFX_H__
    #define __STDAFX_H__
    
    // ... yadda yadda yadda...
    
    #endif // __STDAFX_H__
    
    到你的stdafx.h。如果愿意,可以从stdafx.h中删除#pragma once语句,但这不是必需的


    另一方面,如果尚未包含stdafx.h,那么代码也试图包含它,但无论如何都会导致编译错误。我很确定你只想做一个或另一个…

    重建?还是先清理然后构建?@thinkerou这样做没有效果。那么
    stdafx.cpp
    呢?它在你的项目中吗?目录中存在h文件不仅是要求,
    stdafx.cpp
    必须在项目中编译(您必须在项目浏览器中查看
    stdafx.cpp
    stdafx.h
    ),stdafx.cpp也在那里@VolAndIt希望您在stdafx.h文件中包含MFC头。在第一步中,您建议使用(/Yu),在第三步中,您建议创建(/Yc)。这两者的区别是什么。按照您的描述进行纠正后,我的问题没有得到解决。请帮帮我,你没有仔细阅读<必须为项目设置代码>使用(/Yu)
    <必须为负责PCH生成的
    .cpp
    文件设置code>Create(/Yc)
    。“在您的情况下,您的项目已附加默认stdafx.cpp。请用人民币[…]单击它。”。它指的是
    .cpp
    文件,而不是project。Mark Morrison我已经按照您的建议添加了编译保护,但仍然没有区别。我是否需要删除或添加任何其他内容。
    #ifndef __AFXWIN_H__
        #include"stdafx.h"
        #error "include 'stdafx.h' before including this file for PCH"
    #endif
    
    #ifndef __STDAFX_H__
    #define __STDAFX_H__
    
    // ... yadda yadda yadda...
    
    #endif // __STDAFX_H__