为何要“混合编程”?举个例子:

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代码

最新文章

  1. Asp.Net Core 项目实战之权限管理系统(5) 用户登录
  2. openstack-swift云存储部署(二)
  3. hive问题整理(待续)
  4. Elasticsearch——multi termvectors的用法
  5. 数据库查询Database中的表
  6. jquery的常用的容易忘记的东西
  7. Linux下配置Tomcat服务器
  8. 安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法
  9. 进程与线程(二) java进程的内存模型
  10. 转:SVN 出现This client is too old to work with working copy...错误
  11. SQL2000下修复某数据库的经历
  12. unity之uv贴图画圆弧,圆弧面,不规则图形
  13. video+ audio
  14. U方法
  15. Python之路(第三十七篇)并发编程:进程、multiprocess模块、创建进程方式、join()、守护进程
  16. RoboWare Studio 安装
  17. MySQL调优基础, 与hikari数据库连接池配合
  18. c# 休眠后 定时唤醒
  19. J2EE完全手册(一)
  20. DB2性能调优

热门文章

  1. xmpp 与服务器连接并身份验证成功
  2. BZOJ 1974 [Sdoi2010]auction 代码拍卖会 ——动态规划
  3. BZOJ 1879 [Sdoi2009]Bill的挑战 ——状压DP
  4. poj1930 数论
  5. android本地存储SharedPreferences
  6. mysql date_add日期函数的使用
  7. Lighttpd 服务器的安装
  8. Spring实战Day5
  9. MFC中的双缓冲技术(解决绘图闪烁问题)
  10. 使用CSS去除 去掉超链接的下划线方法