C/C++混合编程出现:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)问题的解决方案

今天试了一下C/C++混合编程,然后就出现了上面那个蛋疼的问题,去网上查了一下,发现原来是C语言和C++预编译头的问题。

error:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

英文版: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)

或者fatal error C1853: 'xxx.pch' is not a precompiled header file created with this compiler. 

这个问题是在VS项目中同时有.c和.cpp文件时,编译器会对它们采用不同的编译方式(主要因为函数声明的处理方式不同,C语言没有多态,函数名编译后比较正常,而C++有多态的特性,所以编译之后函数名面目全非)。

那么预编译头是什么鬼?下面抄自百度百科:

所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,。预编译头物理上与通常的.obj文件是一样的,但是千万不要把这个中间格式与. o/.obj/.a/.lib的格式混淆,他们是截然不同的!所以预编译头文件的特性和目标文件也不同(尽管他们都属于某种中间文件)。编译入预编译头的.h,.c,.cpp文件在整个编译过程中,只编译一次,如预编译头所涉及的部分不发生改变的话,在随后的编译过程中此部分不重新进行编译。进而大大提高编译速度,并便于对头文件进行管理,也有助于杜绝重复包含问题。——但也有类似的地方的,比如,它们都是编译器之间不兼容的^_^,就是说你不能把VC生成的预编译头拿到GCC上去用。甚至扩展名都不一样,VC的是大家都熟悉的. pch,而GCC的,是.gch。


那么什么时候要用预编译头?下面还是抄自百度百科:

1)当大多.c或.cpp文件都需要相同的头文件时。
2)当某些代码被大量重复使用时。
3) 当导入某些不同库都有实现的函数,并产生混乱时。

那么,上面的问题主要就是因为C语言和C++的预编译头不同,VS默认使用的是C++的预编译头,而C语言需要其他类型的预编译头,没法顾全二者的话。

三种解决方案:

1.最简单粗暴的办法就是整个项目都不使用预编译头。不过强烈不推荐,预编译头可以使编译时间大大减少,因而保留预编译头是很重要的。

2.观察一下,看C语言还是C++的文件多,把少的那种文件的预编译头去掉。这种比较简单。

3.将c文件整个设置为一个项目,编译成dll或者lib动态载入,整个项目使用相同的预编译头。

关于预编译头,有两个几个选项,一个是Yu(使用预编译头),一个是Yc(创建预编译头)创建工程的话,stdafx.cpp的选项是Yc,即创建预编译头,而其他文件的属性均为Yu。

关于预编译头设定的修改方法:

由于这里只有一个c文件,所以就直接把.c文件的属性修改成不使用预编译头了。

关于C/C++混合编程还要注意的一个地方,C++要使用C语言的函数,或者引用C语言的头文件时,需要在前面加上extern "C"关键字。

例如:

C语言的.h文件

#ifndef __CFILE_H_
#define __CFILE_H_
 
extern int CTest(int a, int b);
 
#endif
.c文件
#include "CFile.h"
 
int CTest(int a, int b)
{
    return a + b;
}
cpp文件:

#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
extern "C"{
#include "CFile.h"
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a = 1;
    int b = 2;
    cout<<CTest(a, b);
 
    system("pause");
    return 0;
}

--------------------- 
作者:puppet_master 
来源:CSDN 
原文:https://blog.csdn.net/puppet_master/article/details/47682375 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值