• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++中extern "C"的用法

C++中extern "C"的用法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了C++中extern "C"的用法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

学习过C++的人都知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。另外,extern还可以与”C”连用,作为链接指示。本文就此进行实例说明如下:

一、C++名字修饰(Name Mangling)

首先需要从C++的重载说起,在C++中函数重载指的是几个函数的函数名相同,参数列表不同。那么当生成obj中间文件/目标文件的时候,C++编译器如何区分这几个重载函数呢?可以通过把原函数名与参数信息结合,产生一个独特的内部名字,这种技术叫做名字修饰(Name Mangling)。名字修饰规则没有一个标准,所以不同的编译器的名字修饰规则也不一样。

下面是一组函数,其中f()函数重载了:

int f (void) { return 1; } 
int f (int) { return 0; } 
void g (void) { int i = f(), j = f(0); } 

</div>

f(void)和f(int)是不同的函数,除了函数名相同以外没有任何关系。当生成obj目标文件时,为了区分它们,C++编译器根据参数信息进行了名字修饰:

int __f_v (void) { return 1; } 
int __f_i (int) { return 0; } 
void __g_v (void) { int i = __f_v(), j = __f_i(0); }

</div>

注意g()也被名字修饰了,虽然没有任何名字冲突。名字修饰应用于C++的任何符号。

二、为什么要使用extern “C”?

C语言中没有名字修饰(Name Mangling),因为C语言不支持函数重载。但是如果C++中含有C代码,在编译时C++编译器对C代码的函数也会进行名字修饰,函数名变了以后,将导致在C运行库中找不到对应函数,发生链接错误。

// 将下面的代码保存为.cpp文件,并用C++编译器编译 
int printf(const char *format,...); 
  
int main() 
{ 
  printf("GeeksforGeeks"); 
  return 0; 
}

</div>

输出:

/tmp/ccQBO9Im.o:在函数‘main'中: 
test.cpp:(.text+0xf):对‘printf(char const*, ...)'未定义的引用 
collect2: 错误:ld 返回 1 

</div>

为了防止C++编译器对C代码进行名字修饰,我们将C代码用extern “C”进行链接指定,告诉编译器,在生成中间文件时,不要对这部分代码进行名字修饰,而是生成符合C规则的中间符号名。

extern "C" 
{ 
  int printf(const char *format,...); 
} 
 
int main() 
{ 
  printf("Hello!"); 
  return 0; 
}

</div>

添加了extern “C”链接指示后,上面的代码就能够正常运行了。

附:所有的C风格的头文件(stdio.h, string.h, … 等等)都有在extern “C”下声明,形式如下:

#ifdef __cplusplus  
extern "C" { 
#endif 
  /* Declarations of this file */ 
#ifdef __cplusplus 
} 
#endif
</div> </div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28C/C++中退出线程的四种解决方法
  • 2017-05-28C++使用递归方法求n阶勒让德多项式完整实例
  • 2017-05-28C语言socket编程开发应用示例
  • 2017-05-28详解C++编程中数组的基本用法
  • 2017-05-28Qt定时器和随机数详解
  • 2017-05-28C语言 位段的详细介绍
  • 2017-05-28使用C语言判断英文字符大小写的方法
  • 2017-05-28深入分析C++中两个大数相乘结果不正确的问题
  • 2017-05-28使用OpenGL实现3D立体显示的程序代码
  • 2017-05-28C++用new创建对象和不用new创建对象的区别解析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C/C++ 读取16进制文件的方法
    • C++中的内存分区介绍
    • 基于VC中使用ForceInclude来强制包含stdafx.h的解决方法
    • 解析C++ 浮点数的格式化输出
    • Qt如何设置窗口屏幕居中显示以及设置大小
    • 深入解析C++编程中的运算符重载
    • 解决在Mac下直接解压C++静态库出现的问题
    • 浅析C++中cout的运行机制
    • 关于STL中list容器的一些总结
    • 详解C语言中的常量指针和指针常量

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有