免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tremble
打印 上一主题 下一主题

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

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

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

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

好解释啊,这两个f已经是不一样的函数了。这不是简单的C++重载,而是一个是C函数,一个是C++函数。根本就没涉及到重载的概念。

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

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

原帖由 "aero" 发表:

好解释啊,这两个f已经是不一样的函数了。这不是简单的C++重载,而是一个是C函数,一个是C++函数。根本就没涉及到重载的概念。

根本没涉及到重载?那我把这两个函数参数类型也写成一样,还不照样错。
照你说一个是C函数,一个是C++函数,这两个是不一样的。
那我调用的时候是调用C函数还是调用C++函数呢?说到底还不是要根据重载?

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

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

再把我的问题整理一下吧:
  1. extern "C" {
  2. void f(int);
  3. void f(double);
  4. }
复制代码
这样不对,因为这两个函数都是C函数,而C函数没有重载的概念。
所以编译后会报重声明f时冲突!
  1. extern "C" {
  2. void f(int);  //C函数
  3. }
  4. void f(double);  //C++函数
  5. int main()
  6. {
  7.    f(1.0);
  8.     f(1);
  9. }
复制代码

这个程序并没问题,因为f(1.0)会调用void f(double);而f(1)会调用
void f(int);为什么呢?因为这里f()进行了重载解析。但void f(int)
是声明成的C函数呀,怎么说是解析到f(int)上了呢?这不是重载解析吗?
而上面说了C函数不重载的呀。

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

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

原帖由 "THEBEST" 发表:

根本没涉及到重载?那我把这两个函数参数类型也写成一样,还不照样错。
照你说一个是C函数,一个是C++函数,这两个是不一样的。
那我调用的时候是调用C函数还是调用C++函数呢?说到底还不是要根据重载?


重载是C++里的概念。是说两个C++语言写成的函数可以有相同的函数名。而编译的时候会根据参数的不同自动区分。上面不是有人说过了吗?这个“自动区分”其实是编译的时候自动生成了不同的函数名。归根结底还是不同的函数。这就叫做重载。也不知道是为了方便程序员还是混淆程序员。

而你的问题里面的函数,一个是C的,一个是C++的。可以说是编译器用两种不同的机制编译的,甚至可以理解为是用两个编译器编译的一样。由于在extern的外面,是用C++的机制编译的,所以他可以识别出已经有的函数名,而自动的把相同函数名,不同参数的函数用上面的方法换名,理解为重载也可以。而在extern里面,是用C语言的机制编译的,所以遇到相同的函数名,它自然就会报错。

概念不应该理解的太死了。有时候编译器的实现和标准的C还不太一样呢。

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

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

[quote]原帖由 "aero" 发表:


重载是C++里的概念。是说两个C++语言写成的函数可以有相同的函数名。而编译的时候会根据参数的不同自动区分。上面不是有人说过了吗?这个“自动区分”其实是编译的时候自动生成了不同的函数名。归根结底还是不同

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

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

呵呵,你要非这样专牛角尖,就只有一个解决的办法了。去看C++编译器的源代码或者看编译成汇编的代码。看看编译器具体到底是怎么做的。呵呵。

其实,知道怎么回事不就行了?有些时候,写程序前还要对一些自己模糊的概念先写个小程序测试呢。呵呵。

论坛徽章:
0
17 [报告]
发表于 2004-05-29 14:41 |只看该作者

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

原帖由 "THEBEST" 发表:
照你这么说:
extern "C" {
  void f(int){ }
}
void f(int){ }

这样的代码也没什么问题咯?但事实是不可以的。
因为你说这两个函数因为一个按C方式来编译,一个是按C++那产生的函数名肯定不一样是吧,那这不可能会有重定义的问题吧?

你说得没错,如果通过编译的话,这两个函数产生的函数名肯定不一样。但是别忘了,如果要通过编译,你的程序必须语法要正确才行,这是一个前提条件。如果语法不正确,又怎么能通过编译的呢?很明显,你上面的程序就犯了“重复定义”这样的语法错误。

论坛徽章:
0
18 [报告]
发表于 2004-05-29 14:56 |只看该作者

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

我就不明白为什么要这样定义
extern "C" {
void f(int){ }
}
void f(int){ }

难到这个是重载吗??
从来没有见过这样的重载,分明是个语法错误吗,重复定义。

如果可以这样写代码,那这样是不是可以呢:
extern "C" {
int main(){ return 0;}
}
int main(){ return 0;}
????

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

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

对,它们的名字不一样。
可你调用f的时候,
编译器应该选择哪一个呢?

论坛徽章:
0
20 [报告]
发表于 2008-10-01 11:49 |只看该作者
呵呵 学习  cu资源就是丰富啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP