C、C++混合编程之extern "C"
为何要“混合编程”?举个例子:
CHeader.h
#ifndef C_HEADER_H
#define C_HEADER_H
void func();
#endif
CHeader.c
#include "CHeader.h"
#include <stdio.h>
void func()
{
const unsigned char *str = "字符串";
printf("%s\n", str);
}
CMain.c
#include "CHeader.h"
int main()
{
func();
return ;
}
gcc -std=c11 CMain.c CHeader.c -o CMain,编译成功
Main.cpp
#include "CHeader.h"
int main()
{
func();
return ;
}
g++ -std=c++11 CMain.c CHeader.c -o CMain,编译失败,错误信息:invalid conversion from 'const char*' to 'const unsigned char*' [-fpermissive] const unsigned char *str = "字符串";
这是因为在C++标准中char *与unsigned char *之间无法进行隐式地转换。
当然,将CHeader.c中的const unsigned char *str = "字符串";修改为const unsigned char *str = (const unsigned char *)"字符串";即可通过编译,
但本文重点是混合编程^_^
先用gcc编译CHeader.c:gcc -std=c11 CHeader.c -c,会得到CHeader.o,
然后用g++进行编译:g++ -std=c++11 Main.cpp CHeader.o -o Main,编译不通过,错误信息:undefined reference to 'func()',
这时extern "C"就派上用场了:将Main.cpp中的#include "CHeader.h"更改为
extern "C"
{
#include "CHeader.h"
}
再次使用g++ -std=c++11 Main.cpp CHeader.o -o Main进行编译,编译成功
因为VC++会根据源文件扩展名区分是C还是C++,所以在使用VC++进行混合编程时仅需在C++代码中注明extern "C"即可调用C代码
最新文章
- Asp.Net Core 项目实战之权限管理系统(5) 用户登录
- openstack-swift云存储部署(二)
- hive问题整理(待续)
- Elasticsearch——multi termvectors的用法
- 数据库查询Database中的表
- jquery的常用的容易忘记的东西
- Linux下配置Tomcat服务器
- 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法
- 进程与线程(二) java进程的内存模型
- 转:SVN 出现This client is too old to work with working copy...错误
- SQL2000下修复某数据库的经历
- unity之uv贴图画圆弧,圆弧面,不规则图形
- video+ audio
- U方法
- Python之路(第三十七篇)并发编程:进程、multiprocess模块、创建进程方式、join()、守护进程
- RoboWare Studio 安装
- MySQL调优基础, 与hikari数据库连接池配合
- c# 休眠后 定时唤醒
- J2EE完全手册(一)
- DB2性能调优