extern "C" c++如何实现函数的重载
来源:互联网 发布:最新前端技术编程语言 编辑:程序博客网 时间:2024/05/17 23:58
本文的参考来源于:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html
具体的代码可以参考这篇文章:https://m.oschina.net/blog/172670
C++是一个面向对象语言(虽不是纯粹的面向对象语言),它支持函数的重载,重载这个特性给我们带来了很大的便利。为了支持函数重载的这
个特性,C++编译器实际上将下面这些重载函数:
1
2
3
4
void print(int i);
void print(char c);
void print(float f);
void print(char* s);
编译为:
1
2
3
4
_print_int
_print_char
_print_float
_pirnt_string
但是在C语言中,并没有重载的特性,所以,不会像c++那样编译出一个叫做_print_int的函数,而是直接编译出_print函数,这样,在
C语言中并没有重载和类这些特性,故并不像C++那样print(int i),会被编译为_print_int,而是直接编译为_print等。因此如果直接在C++中调用C的函数会失败,因为连接是调用C中的print(3)时,它会去找_print_int(3)。因此extern "C"的作用就体现出来了。
//t.cpp #include "lib.h"#include "stdio.h"/*extern "C"{*/#include "lib.h"/*}*/int main (int argc, char** argv){say_hello() ;return 0;}
//lib.cint say_hello (){ printf("hello world, "); return 0;}
//lib.h#ifndef __LIB_H__#define __LIB_H__int say_hello ();#endif
比较重要的extern “C”是在编译的过程中就会做一些活动,在编译阶段就会将函数名编译成为自己想要的,链接的时候再去找对应的函数,所以,如果是如上的几个文件采用的编译链接方式是g++ lib.c t.cpp 那么是可以正常的编译链接的,因为都是用的g++ = =。
简单的编译模式是:
但是如果我们用的编译选项是gcc -c lib.c 然后g++ t.cpp 然后是 g++ lib.o t.o 那么就会出现找不到函数定义的问题。
如果编译成为动态链接库,编译方式是:
gcc lib.c -fPIC -shared -o libtest.so
g++ t.cpp -L. -ltest -o test
因为把extern “C” 注释掉了,所以undefined reference to `say_hello,虫合虫合
0 0
- extern "C" c++如何实现函数的重载
- 如何实现 C 的函数重载
- 函数重载与Extern "C"
- c函数重载的实现
- 关于extern “C” 对函数重载的影响
- extern "C" 与函数重载机制
- C++函数重载以及extern "C"
- C++函数重载与extern "C"
- c语言如何实现函数重载
- extern C实现C与C++函数的相互调用
- extern C(C++与C实现相互函数的调用)
- [c++]如何取重载函数的地址
- C语言是实现函数的重载
- C函数的模拟重载实现说明
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明
- 【C++】函数的重载
- 【c++】函数的重载
- 【c++】实现一个函数重载
- VS设置使用UNICODE
- MyBatis级联探讨第三篇——一对一和一对多
- 矩阵、向量求导法则
- UNPv1第二十三章:线程
- Unity3D基于物理的物体拖拽
- extern "C" c++如何实现函数的重载
- Android笔记:Activity的生命周期以及启动模式
- Android学习(45) -- 自定义控件(9) 下拉刷新 (添加footer)
- 在Linux中使用unzip打开zip文件失败
- 各种排序算法
- XAPO中LockForProcess 音频格式设置以及数据处理后的音频格式
- jQuery常用方法2
- 五种排序的思想及其基本实现
- Java IO:BufferedInputStream使用详解及源码分析