C/C++编译问题

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

参考:https://blog.csdn.net/puppet_master/article/details/47682375

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++有多态的特性,所以编译之后函数名面目全非)

四种解决方案:

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

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

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

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

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

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

4.修改c文件编译为c++代码(配置属性 - C/C++ - 高级 - 编译为C++代码)

关于C/C++混合编程还要注意的一个地方,C++要使用C语言的函数,或者引用C语言的头文件时,需要在前面加上extern "C"关键字,使得就算.h文件被C++文件包含时,仍然能够以C语言的命名方式编译.h文件。

#ifndef __IMB_IMBUF_H__
#define __IMB_IMBUF_H__
 
#ifdef __cplusplus
extern "C" {
#endif
//.h declaration here.....
 
#ifdef __cplusplus
}
#endif
#endif

二、在C++遇到有些关键字或者函数被弃用的情况

随着每一次C++的不断更新,可能都会有些函数或者关键字会被弃用,或者换成了其他的名字,这在编写代码的时候经常会碰到,碰到这种情况,可以在代码的第一行写上忽略此错误的句子,一般为:

#pragma  warning(disable:错误编号)

如:下面这段代码中使用了strdup(),此函数的功能是讲函数中的数据拷贝到另一个变量中,这是调试程序会出现下面的错误:

错误 1 error C4996: 'strdup': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strdup. See online help for details. d:\c++workspace\consoleapplication5\consoleapplication5\consoleapplication5.cpp 30 1 ConsoleApplication5

此错误的编号是4996

所以我们要调试成功,可以这样写代码:

#pragma  warning(disable:4996)

代码添加位置:

#include "stdafx.h"
#pragma warning(disable:4996)
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <string>

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值