`

extern “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