免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3706 | 回复: 19
打印 上一主题 下一主题

向大家求教extern "C"{...}的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-09 17:02 |只看该作者 |倒序浏览
在c++程序中,下面的写法表是什么意思?
extern "C"{

#include <string.h>;

#include <stdlib.h>;

#include <stdio.h>;

}

其中extern "C"这写法是固定的吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-05-09 19:56 |只看该作者

向大家求教extern "C"{...}的问题。

这是为了可以在c++程序里面
使用c的库函数。

论坛徽章:
0
3 [报告]
发表于 2004-05-10 10:08 |只看该作者

向大家求教extern "C"{...}的问题。

原帖由 "lenovo" 发表:
这是为了可以在c++程序里面
使用c的库函数。


也就是说在c++程序中使用c的函数时候,无须改变c语言函数的名字的意思吗?

论坛徽章:
0
4 [报告]
发表于 2004-05-10 10:15 |只看该作者

向大家求教extern "C"{...}的问题。

使用C的函数调用机制和名字处理规则

论坛徽章:
0
5 [报告]
发表于 2004-05-10 10:26 |只看该作者

向大家求教extern "C"{...}的问题。

[quote]原帖由 "_z_"]使用C的函数调用机制和名字处理规则[/quote 发表:


谢谢。:)谢谢大家毫无保留的指教。

论坛徽章:
0
6 [报告]
发表于 2004-05-10 10:54 |只看该作者

向大家求教extern "C"{...}的问题。

C++编译器使用一种称为"Name Mangling"的机制来支持函数重载和类型安全的链接。例如下面的重载函数:
void f(int);
void f(char);
经常被C++编译器处理为类似_f_int()和_f_char()这样的“内部”名字,用以区分重载函数,以及在链接的过程中保证对函数的调用被解析到正确的代码上。

设想你在C++程序中调用C的库函数。由于C没有重载的概念,类型系统也比C++弱,所以C编译器是不做Name Mangling的。如下面的函数声明:
void f(int, char);
被C++编译器处理后的名字应该是类似_f_int_char()这样的,但是假设这个函数是一个C库函数,你只有它的声明(头文件)和实现(已经编译过,供链接的库文件),而库文件中的符号表是C编译器生成的,这个函数的“内部”名字是_f()。链接的时候linker无法将对_f_int_char()的调用解析到_f()上,自然会出现链接错误。

解决的办法就是用下面的声明:
extern "C" void f(int, char);
告诉C++编译器,这不是一个C++函数,编译时需要按照C语言的规则来处理名字,以便linker能够正确链接。

可以用下面的格式集中声明很多这种函数:
extern "C" {
fun1();
fun2();
...
}

也可以用下面的格式,将一个头文件中的全部函数,声明为按照其他语言的编译方式来处理。
extern "C" {
#include <stdio.h>;
}

注意extern "C"修饰的函数按照C的编译调用方式来处理,因此下面的代码是违法的:
extern "C" {
int f(int);
int f(double);
}
即声明为extern "C"的函数不允许重载。

论坛徽章:
0
7 [报告]
发表于 2004-05-10 11:17 |只看该作者

向大家求教extern "C"{...}的问题。

不错

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-05-10 13:15 |只看该作者

向大家求教extern "C"{...}的问题。

原帖由 "chg.s" 发表:
注意extern "C"修饰的函数按照C的编译调用方式来处理,因此下面的代码是违法的:
extern "C" {
int f(int);
int f(double);
}
即声明为extern "C"的函数不允许重载。
  1. extern "C" {
  2. void f(double){}
  3. }
  4. void f(int){}
  5. int main()
  6. {
  7.    f(1);
  8.    f(1.0);
  9.    system("pause");  
  10. }
复制代码

好.那f(double)是按照C的方式来处理的.而f(int)是按照C++的方式来的.
而按照C的方式来处理的函数按理来说应该"不支持"重载吧?当然这样当然是正确的程序.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-05-25 14:38 |只看该作者

向大家求教extern "C"{...}的问题。

怎么解释呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-05-25 18:01 |只看该作者

向大家求教extern "C"{...}的问题。

这个是c++程序呀。
你到底想问什么?
谁不支持重载?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP