`
zzc1684
  • 浏览: 1229373 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

extern "C"的作用

阅读更多
可以在C++中使用C的已编译好的函数模块,在c++中么用到c语言写的函数,声明一下,在DLL中经常看到,避免C++ name mangling,主要用于动态链接库,使得导出函数名称与C语言规则一致(不改变),方便不同的编译器甚至是不同的开发语言调用。

extern "C"是告诉C++编译器以C Linkage方式编译,也就是抑制C++的name mangling机制。例如: 

void Test(void); 

C++编译器可能实际把它改名为vTest_v,C++的重载/namespace等机制就是这样来的。而 

extern "C" void Test(void) 

则和C编译器一样为_Test。 

主要用与在C++代码中调用的C函数的声明,或C++中编译的函数要在C中调用。

一、修饰名(Decorated Name)

C/C++程序中的函数在内部是通过修饰名来标识的。修饰名是在函数定义或原型编译阶段由编译器创建字符串。当你在LINK等工具中要指定一个函数名时,会用到修饰名。

1、使用修饰名:

大多数情况下,你不必知道函数的修饰名是什么。连接器等工具通常都能处理函数未修饰的名字。然而,在有些情况下,你可能需要指定函数的修饰名。对于C++重载函数和特定的成员函数(如:构造函数和析构函数),你必须指定这些函数的修饰名,以便连接器等工具能够匹配名字。同时,你也必须在那些引用c或c++函数名的汇编源文件中使用修饰名。

2、查看修饰名:

如果你编译了一个源文件,该源文件中包含了函数定义或原型,你可以获得函数的修饰名形式。

(1)用编译器列表(compiler listing)来查看:

   (i)通过将列表文件类型编译器选项(/FA[c|s]) 设置为下面中的一种,来产生列表文件:Assembly with Machine Code (/FAc); Assembly with Source Code (/FAs); Assembly, Machine Code, and Source (/FAcs).

   (ii)在产生的列表文件中,找到包含未经修饰的函数定义的行。

   (iii)查找前面一行。PROC NEAR 命令标签前就是函数名经过修饰后的形式。

(2)使用DUMPBIN工具来查看:

在.OBJ或.LIB上运行 DUMPBIN,使用/SYMBOLS选项。在输出中查找未经修饰的函数定义。后面跟着的就是经过修饰的函数名,用圆括号括起来的。

二、替代连接说明:

如果在c++中编写一个程序需要用到c的库,那该如何?如果这样声明一个c函数:

void f(int a,char b);

c++编译器就会将这个名字变成相应的修饰名,比如:?f@@YAXHD@Z。

然而,c编译器编译的库的内部函数名(连接器使用)是完全不同的。这样,当c++连接器连接c的函数库时,将会产生内部使用函数不匹配。

故,c++中提供了一个替代连接说明(alternate linkage specification),它是通过重载extern关键字来实现的。

extern后跟一个字符串来指定想声明的函数的连接类型,后面是函数声明,比如:

extern "C" void f(int a,char b);

这样,就是告诉编译器是c连接,这样就不会转换函数名了。此例中,编译后的内部函数名是_f。

 

分享到:
评论

相关推荐

    extern关键字的作用

    extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用extern关键字的作用...

    浅析extern “C”的作用

    这就引出了extern "C"的第一个作用:允许C++代码调用C语言编写的函数。当C++程序需要调用C语言库函数时,必须使用extern "C"来告诉编译器,这些函数是按照C的命名约定来编译的,因此在链接时应该按照C语言的函数名来...

    extern在C和C++中的作用

    - **`extern "C"`的作用**:当在C++环境中使用C语言库时,需要通过`extern "C"`来避免名字修饰的发生,从而确保函数能够正确地被链接器识别。 #### 使用示例 假设有一个C语言定义的函数`void myFunc(int x);`,...

    extern C详细解释

    `extern "C"`用于告诉C++编译器,在处理其后的代码时,应采用C语言的链接约定。这意味着编译器不会对函数名进行修饰,而是保持其原始形式。这对于在C++代码中调用C语言编写的库或函数至关重要。 在实际应用中,`...

    关于externC的超详解

    在C++编程中,`extern "C"`是一个特殊的声明,用于告诉编译器按照C语言的规则处理特定的函数和变量。...在阅读“关于externC.txt”这个文件时,你可以期待深入学习到更多关于`extern "C"`的具体细节和实际应用案例。

    extern c 用法解析

    在C++编程中,`extern "C"`是一个特殊的声明,用于指示编译器按照C语言的规则处理函数和全局变量,而不是C++的标准方式。由于C++支持函数重载和名称修饰(name mangling),这可能导致C++编译的代码与C编译的代码在...

    extern "C"的详细用法+demo

    在C++编程中,`extern "C"`是一个特殊的声明,用于告诉编译器按照C语言的规则处理特定的函数或变量。这是因为C++支持名称修饰(Name Mangling),即编译器为了支持重载和其他特性,会改变函数和变量的原始名称。而...

    C语言中的extern关键字详细讲述

    通过上述讨论,我们可以总结出`extern "C"`的关键作用在于桥接C++和C代码之间的链接差异,使C++能够顺利地与C代码交互。在C++项目中使用C库或编写需要被C代码调用的C++库时,合理地使用`extern "C"`是非常重要的。 ...

    C语言extern使用方法总结.doc

    C语言extern使用方法总结 在C语言中,extern关键字是一个非常重要的概念,它可以用来声明全局变量和函数,但是很多人却不太了解它的使用方法。在本文中,我们将详细介绍extern关键字的使用方法和注意事项。 声明和...

    extern关键字作用.docx

    2. **extern "C" 的作用**: `extern "C"`是一种特殊的链接指示符,用于解决C++与C或其他语言的兼容性问题。C++支持名称修饰(name mangling),即编译器会根据函数的参数类型和返回类型对函数名进行编码,以便在...

    C语言之extern声明辨析

    C语言之extern声明辨析 extern关键字是C语言中的一种修饰符,用于声明变量或函数的定义在其他文件中。它可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中...

    C/C++中extern "C" 的作用分析

    `extern "C"` 的作用就是在告诉编译器,即使在C++环境中,也应该按照C语言的规则来处理后面的声明,即不进行名称修饰。这样,C++代码就可以正确地找到和调用C语言定义的函数。 用法上,`extern "C"` 声明通常有两种...

    C语言中extern用法总结

    这是因为C++支持函数重载,导致函数名可能发生变化,而`extern "C"`可以确保函数名与C语言中的保持一致。 #### 四、总结 `extern`关键字是C语言中用于实现多个源文件间通信的重要手段之一。正确理解和使用`extern`...

    extern 'C' 详解

    它的主要作用是实现 C++ 与 C 语言的混合编程。 extern "C" 包含双重含义:一是被它修饰的目标是“extern”的,即该函数或变量可以在其他模块中使用;二是被它修饰的目标是“C”的,即该函数或变量将按照 C 语言的...

    iOS extern使用教程

    本教程将深入讲解`extern`的使用方法,以及它在iOS应用程序开发中的作用。 首先,我们要明白`extern`关键字的基本用法。在C/C++语言中,`extern`是用来告知编译器变量或函数是在其他地方定义的。当你在某个文件中...

    extern “C”使用详解.doc

    总结来说,`extern "C"`是C++为兼容C语言而设计的关键字,它让C++代码可以正确链接到C库,同时也使得C库可以被C++代码调用。理解并合理使用`extern "C"`,能够帮助我们在C++中无缝地集成C代码,提高代码的复用性和...

    C++中extern “C”含义深层探索.doc

    总结来说,`extern "C"`在C++中起到了桥接作用,使得C++代码能够正确地引用和使用C语言编写的函数和全局变量,保证了两个语言间的互操作性。在编写跨语言接口或使用C库时,`extern "C"`是非常重要的。理解和正确使用...

    C语言extern关键字的用法

    #### 二、`extern`关键字的基本作用 1. **声明外部变量**: - `extern`关键字用于声明一个外部变量,表明该变量的定义在当前源文件之外的其他地方。 - 使用`extern`声明的变量在编译阶段会被链接器解析,找到其...

    探索C++的秘密之详解extern

    总之,extern "C"是C++语言提供的一种链接指定,它允许程序员在C++代码中调用C语言编写的功能,或者在C++的库中使用C语言编写的部分,是C++语言为了兼容和链接C语言代码提供的一种机制。通过使用extern "C",可以...

Global site tag (gtag.js) - Google Analytics