我在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
我尝试使用不使用预编译标题选项编写代码,但仍然遇到同样的错误。
如何纠正这个问题。感谢
答案 0 :(得分:0)
也许你一直在努力解决这个问题,事实上,你已经破坏了一些东西。让我们在Visual Studio中正确配置预编译的头文件使用(我将使用VS2012中的选项名称):
启用PCH的使用:项目属性 - &gt; Configuration Properties
- &gt; C/C++
- &gt; Precompiled Headers
- &gt; Precompiled Header
- &gt; Use (/Yu)
。
设置预编译标题的名称:项目属性 - &gt; Configuration Properties
- &gt; C/C++
- &gt; Precompiled Headers
- &gt; Precompiled Header File
。在您的情况下,您应该看到标准的PCH名称(stdafx.h
)。如果你愿意,你可以改变它。
(事实上,最重要的一步)启用PCH生成:标头是不够的。您还需要一个.cpp
文件,该文件负责PCH内容的生成(因为只能编译源文件)。在您的情况下,您的项目附加了默认stdafx.cpp
。点击人民币,然后:Configuration Properties
- &gt; C/C++
- &gt; Precompiled Headers
- &gt; Precompiled Header
- &gt; Create (/Yc)
。
从现在开始,附加到项目的每个源文件的第一个非空行(包括第3步中负责PCH生成的源文件)应该如下所示:
#include "PCH_NAME"
其中PCH_NAME
是步骤2中设置的预编译标头的名称。
以这种方式设置所有这些设置后,我建议您:
Output Directory
和Intermediate Directory
的项目属性路径。删除它们(我希望它们不包含任何代码 - 它们不应该)。your solution name-cc50b4e6
的文件夹。删除它。这将完全重置您的解决方案(包括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,但是无论如何都会导致编译错误。我很确定你只想做其中一个......