`
carge
  • 浏览: 50074 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

【转载】在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern "C"声明

 
阅读更多

【来源】:http://blog.myspace.cn/e/400991786.htm

 

     主要是为了解决C++中函数可以重载这个特性,详细原因如下:函数经过编译系统的翻译成汇编,函数名对应着汇编标号。因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main但是C++中函数名与得到的汇编代号有比较大的差别。如:由于函数重载,函数名一样,但汇编代号绝对不能一样。为了区分,编译器会把函数名和参数类型合在一起作为汇编代号,这样就解决了重载问题。具体如何把函数名和参数类型合在一起,要看编译器的帮助说明了。这样一来,如果C++调用C,如fun(),则调用名就不是C的翻译结果_fun,而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决这个问题,加上extern "C"表示该函数的调用规则是C的规则,则调用时就不使用C++规则的带有参数信息的名字,而是_fun,从而达到调用C函数的目的。

 

分享到:
评论

相关推荐

    在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?.pdf

    。。。

    在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?.docx

    。。。

    C_C++笔试题集锦_(已排版)

    2. 什么是“引用”?申明和使用“引用”要注意哪些问题? 4. 在什么时候需要使用“常引用”?  11. 已知strcpy的函数原型:char *strcpy(char...15.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?

    富士通笔试题与解答 经典

    (3) 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明? 答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的...

    大学四年里编写的c或c++的代码.rar

    所以C++中的函数,声明前如果加上extern ”C“, 那么编译器就不会对它做命名修饰,编译出来的代码就可以在C程序中直接调用。 当然在调用之前还是要先声明的。C语言不兼容C++,所以不能直接包含.hpp等C++的头文件。...

    C++中如何调用C语言的代码实现

    /*如果有这两个函数要被调用,在C语言中函数重载是不允许的,那么在C++中为什么可以呢。 C++中就是使用了mangle技术,对函数重载的函数名加上编译器中自定义规则的表示符,编译之后的函数名就会不一样。 例如 func...

    C/C++中extern “C” 的作用分析

    我们经常会在C/C++程序中见到extern “C”,这是一个很重要的概念...反过来,.cpp文件中定义的函数,.c文件要调用,则同样要在.cpp文件中用extern “C”声明,.c文件只用普通的extern声明。 两个源文件分别编译成.o文件

    C/C++笔试题(附答案,华为面试题系列)

    在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明? 答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的...

    你必须知道的495个C语言问题

    3.15 我要检查一个数是不是在另外两个数之间,为什么if(abc)不行? 3.16 为什么如下的代码不对?inta=1000,b=1000;longintc=a*b; 3.17 为什么下面的代码总是给出0?doubledegC,degF;degC=5.0/9*(degF-32); ...

    《你必须知道的495个C语言问题》

    3.15 我要检查一个数是不是在另外两个数之间,为什么if(a b c)不行? 40 3.16 为什么如下的代码不对?int a=1000, b=1000; long int c=a * b; 40 3.17 为什么下面的代码总是给出0?double degC, degF; degC= ...

    C语言FAQ 常见问题列表

    o 2.4 extern 在函数声明中是什么意思? o 2.5 关键字 auto 到底有什么用途? o 2.6 我似乎不能成功定义一个链表。我试过 typedef struct { char *item; NODEPTR next; } *NODEPTR; 但是编译器报了错误信息。难道...

    你必须知道的495个C语言问题.pdf

    3.15 我要检查一个数是不是在另外两个数之间,为什么if(a b c)不行? 3.16 为什么如下的代码不对?int a=1000, b=1000; long int c=a * b; 3.17 为什么下面的代码总是给出0?double degC, degF; degC= 5.0 / 9 * ...

    特殊的C++笔试题,非常不错的

    这样一来,如果C++调用C,如fun(),则调用名就不是C的翻译结果_fun, 而是带有参数信息的一个名字,因此就不能调用到fun(),为了解决这个问题,加上extern "C"表示该函数的调用规则是C的规则,则调用时就不使用C++...

    最新名企标准通用C++面试题,

    2、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”? 答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int...

    自己写的dll的简介

    我们知道C++程序要使用C语言的函数就必须在函数声明前加上extern "C"关键字,这对于静态库和DLL没有什么不同。 但是这个关键字不能直接出现在头文件函数声明中,否则DLL无法通过编译, 原因很简单,C语言并没有...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    《c语言教程(原书第4版)》是一本优秀的c程序设计语言教材,完整描述了ansi c语言及其语法特性,并对c语言的高级特性和应用作了深入阐述,介绍了从c到c++和java过渡的相关知识。《c语言教程(原书第4版)》的一个...

    C#与C++与互操作实例讲解

    一、C#调用C++库 1、创建C++库 打开VisualStudio,创建一个C++工程,输入项目名称...加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。 #include stdafx.h #include<iostre

Global site tag (gtag.js) - Google Analytics