当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,若是项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)(致命错误C1853: “filename.pch”预编译头文件来自编译器的早期版本,或者预编译头为C++ 而在C 中使用它(或相反))。函数
该错误是由于当项目中混合了 .cpp 和 .c 文件时,编译器会对它们采起不一样的编译方式(主要是由于对函数声明的处理方式不一样),于是不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的 (stdafx.h 和 stdafx.cpp),固然也能够建立针对 C 的预编译头。有趣的是,在旧版的 VC++ 中,这个错误的提示很具备误导性:fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 经常让人摸不着头脑。应该说,在新版中的这个提示是有所改进的。不过在网上搜索一番,对这个问题每每都是建议对整个项目取消预编译头的设置。这显然不是一个好的解决方案。对于一个比较大的工程来讲,使用预编译头能够使总的编译时间大大减小。于是保留预编译头的设置才是比较好的解决方案。搜索 MSDN,针对不一样的状况,能够有不一样的解决方案:this
本人是用方法已解决的spa
方案1:适用于绝大多数文件是 .cpp 或绝大多数文件是.c的状况。在这种状况下,将少数的不一样类文件设为不使用预编译头是比较平衡的作法,方法是:对于 VC++6.0,在 FileView 里对要取消预编译头的 .c (或 .cpp) 文件点右键,选择 settings,在弹出的对话框右边选择 category 为 precompiled headers,再设置选项为 not using ...;(对于 VS2005,则在 solution explorer 中对相应文件点右键选择 properties,在 precompiled headers 项下设置 not using... 便可。若是须要设置多个文件,则能够按住 Ctrl 键再同时选中这些文件并设置)PS:解释以下点击项目 点击属性 而后选择C/C++ 预编译头 建立使用头文件 不使用预编译头文件设计
方案2:影响的文件比较多,则把它们都设置禁止预编译头的话仍然会使项目整体的编译速度大大下降,得不偿失。这时考虑能够为这组文件创建专用的预编译头。在 VC++ 极早期版本(1.5及之前版本)中是支持单个工程中创建分别针对 .c 和 .cpp 的预编译头的,但以后的版本中只支持单独的预编译头。在这种状况下,咱们能够在workspace(或 solution)中创建一个新的静态连接库 (Static Library) 工程,将全部的 .c 文件独立出来加入到该工程中单独编译,这样就能够在该静态连接库中针对 .c 文件建立预编译头。可是这样作在必定程度上须要被独立出来的代码在逻辑上是属于同一模块中的,这样才便于维护。不过从设计的角度来讲,这个要求通常是知足的,不然就应考虑下项目的整体设计了:P 最后别忘了设置原项目的依赖项 (dependency) 为独立出来的这个静态库项目。编译器