包括预编译头的错误

时间:2015-04-09 05:49:06

标签: c++ visual-studio-2010

我在Windows 7上使用Visual Studio 2010编写了一个用于控制台应用程序的代码。我已经包含了这个中使用的库,但是当我使用头文件构建程序时,它只能包含“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 ”的内容为

// StGETriggerSample.h : main header file for the PROJECT_NAME application
//
//#include"stdafx.h"
#pragma once

#ifndef __AFXWIN_H__
#include"stdafx.h"
    #error "include 'stdafx.h' before including this file for PCH"
#endif

#include "resource.h"       // main symbols


// CStGETriggerSampleApp:
// See StGETriggerSample.cpp for the implementation of this class
//

class CStGETriggerSampleApp : public CWinApp
{
public:
    CStGETriggerSampleApp();

// Overrides
    public:
    virtual BOOL InitInstance();

// Implementation

    DECLARE_MESSAGE_MAP()
};

extern CStGETriggerSampleApp theApp;

stdafx.h ”的内容是:

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO: reference additional headers your program requires here

我尝试使用不使用预编译标题选项编写代码,但仍然遇到同样的错误。

如何纠正这个问题。感谢

2 个答案:

答案 0 :(得分:0)

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

  1. 启用PCH的使用:项目属性 - &gt; Configuration Properties - &gt; C/C++ - &gt; Precompiled Headers - &gt; Precompiled Header - &gt; Use (/Yu)

  2. 设置预编译标题的名称:项目属性 - &gt; Configuration Properties - &gt; C/C++ - &gt; Precompiled Headers - &gt; Precompiled Header File。在您的情况下,您应该看到标准的PCH名称(stdafx.h)。如果你愿意,你可以改变它。

  3. (事实上,最重要的一步)启用PCH生成:标头是不够的。您还需要一个.cpp文件,该文件负责PCH内容的生成(因为只能编译源文件)。在您的情况下,您的项目附加了默认stdafx.cpp。点击人民币,然后:Configuration Properties - &gt; C/C++ - &gt; Precompiled Headers - &gt; Precompiled Header - &gt; Create (/Yc)

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

    #include "PCH_NAME"
    

    其中PCH_NAME是步骤2中设置的预编译标头的名称。

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

    1. 清洁您的解决方案。
    2. 签入Output DirectoryIntermediate Directory的项目属性路径。删除它们(我希望它们不包含任何代码 - 它们不应该)。
    3. 在解决方案文件夹(*)中,您还应该看到名称为your solution name-cc50b4e6的文件夹。删除它。
    4. 这将完全重置您的解决方案(包括IntelliSense数据库等)。然后,打开您的项目并进行编译。

      (*) - 在您的解决方案文件夹中,默认情况下为 。如果您设置了有效Fallback Location,则会将其放置在那里。

答案 1 :(得分:0)

在代码中:

#ifndef __AFXWIN_H__
    #include"stdafx.h"
    #error "include 'stdafx.h' before including this file for PCH"
#endif

看起来StGETriggerSample.h通过查找编译保护宏AFXWIN_H__来检查stdafx.h是否已被#included。但是,stdafx.h实际上并没有定义这个守护宏,它只是依赖于“#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,你的代码也会尝试#include stdafx.h,但是无论如何都会导致编译错误。我很确定你只想做其中一个......