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

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

C、C++混合编程之extern "C"的更多相关文章

  1. C和C++混合编程之 extern “C”的使用

    C和C++混合编程之 extern "C"的使用 首先要明白: C++号称是C语言的超集,也确实,从语言的基本语法上,C++是包含所有C语言的语法的,而且C++为了兼容C,连C语言 ...

  2. C++混合编程之idlcpp教程Python篇(9)

    上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...

  3. C++混合编程之idlcpp教程Lua篇(9)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程LuaTutorial7中除了四个文件LuaTutorial7.c ...

  4. C++混合编程之idlcpp教程Python篇(8)

    上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:Pyt ...

  5. C++混合编程之idlcpp教程Lua篇(8)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程LuaTutorial6中,同样加入了四个文件:LuaTutori ...

  6. C++混合编程之idlcpp教程Python篇(7)

    上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...

  7. C++混合编程之idlcpp教程Lua篇(7)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与LuaTutorial4工程相似,工程LuaTutorial5中,同样加入了四个文件: ...

  8. C++混合编程之idlcpp教程Python篇(6)

    上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...

  9. C++混合编程之idlcpp教程Lua篇(6)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程LuaTutorial4中加入了四个文件:LuaTutorial4.cpp, Tut ...

随机推荐

  1. iOS 3D UI(3D翻转)

    demo链接:http://pan.baidu.com/s/1eQVPj0m 先写个demo

  2. cell展开的几种方式

    一.插入新的cell 原理: (1)定义是否展开,和展开的cell的下标 @property (assign, nonatomic) BOOL isExpand; //是否展开 @property ( ...

  3. iOS静态库(.a文件)

    1.找到静态库工程

  4. Powerdesigner 使用小技巧

    1.table与table之间:改直角为直线; 2.Name 和code 不联动

  5. golang文件下载断点续传(下载客户端)

    客户端: //const ( // UA = "Golang Downloader from Kejibo.com" //) func DownloadController(ctx ...

  6. centos 关于防火墙的命令

    CentOS7默认的防火墙不是iptables,而是firewalle. 安装iptable iptable-service #先检查是否安装了iptables service iptables st ...

  7. [bzoj1110][POI2007]砝码Odw_贪心

    bzoj-1110 POI-2007 砝码Odw 参考博客:http://hzwer.com/4761.html 题目大意:在byteotian公司搬家的时候,他们发现他们的大量的精密砝码的搬运是一件 ...

  8. synchronized初识

    作用域: 1.对象实例内--->People jack = new Jack(); ①此作用域内的synchronized锁 ,可以防止多个线程同时访问这个对象的synchronized方法 ② ...

  9. 《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

    本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论. MyBatis将数据缓存设计成两级结构,分为一级缓存 ...

  10. Spring注入内部的Beans

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/injecting-inner-beans.html: 如你所知,Java内部类在其他类的范围内定义 ...