预编译头文件:关于“stdafx.h”无法打开或者意外结尾的错误
预编译头文件:关于“stdafx.h”无法打开或者意外结尾的错误
从同事那拷贝h和cpp文件过来的时候遇到了“关于“stdafx.h”无法打开或者意外结尾的错误”
查到解决方法是:
可以在工程setting 中,选择c/c++选项,category下来菜单选择Precompiled Headers,选择Not Using Precompiled headers。
因为我拷贝过来的时候,该cpp的Precompiled Headers,的值是使用预编译头文件.因为我是初学者,所以一开始对预编译头文件什么的不清楚,以test.h和test.cpp为例,我是把#include "stdafx.h"写在test.h文件中的,test.cpp中没有写,所以用这种方法可以解决。
但是我又仔细一想,如果用这种方法解决的话,那么这个test.cpp就不使用预编译头文件,那么必定在test.h展开在test.cpp文件中时编译的话会把这个stdafx.h当作一个普通的头文件,必定会去编译stdafx.h里面包含的所有文件。这完全违背了我们使用预编译头文件来加快编译速度的初衷了。
但是为什么我这样写test.h和test.cpp会报这个错误呢(关于“stdafx.h”无法打开或者意外结尾的错误), 原来因为该cpp的Precompiled Headers,的值是使用预编译头文件(即把stdafx.h当作预编译头文件),但是我的test.cpp中又没写#include "stdafx.h",于是编译该cpp时会找不到这个预编译头文件,但是我想我的test.h中写了#include "stdafx.h"啊,理论来说,h展开到cpp后,cpp相当于有了#include "stdafx.h",怎么还会出错呢?后来发现在编译任何一个cpp文件的时候,首先会根据你的编译头文件选项去判断,如果你选择的是使用预编译头文件,则就会去找到cpp中的#include "stdafx.h"这一行,找这一行是为了直接跳到下一行继续编译,(这就是为什么要把#include "stdafx.h"放在cpp文件的第一行,你放第二行,那么第一行的会直接跳过)继续编译的过程发现#include test.h,再展开。再继续编译。。如果发现没找到#include "stdafx.h"就报错,如果你选择的是不使用预编译头文件,那么编译时就按照正常的编译顺序来,从上到下,遇到#include test.h,展开,展开后有#include "stdafx.h",把stdafx.h这里面的包含的所有文件都编译。然后继续。。
下面给出的摘自网上
下面给出一个使用预编译头文件的操作步骤, 享受一下预编译头文件给我们带来的编译速度的提升:
1) 添加一个stdafx.h文件(名字随便取, 这里用了VS默认提供的名称), 在这个.h文件里include要使用的头文件(一般是外部的库, 自己写的不常变的头文件也可以加进来)
2) 添加一个stdafx.cpp文件, 并include "stdafx.h"
3)项目属性-->c/c++-->Precompiled设置为Use Precompiled Header, stdafx.h
4)stdafx.cpp属性-->c/c++->Precompiled设置为Create Precompiled Header, stdafx.h