c语言同名函数问题

来源:百度知道 编辑:UC知道 时间:2024/06/30 22:52:22
在一个c文件中定义了int listid(int id, OUT *);
然后在另一个c文件中定义:extern "C" int listid(int id, OUT *);

void listid(UI& u, int id)
{
OUT out = { NULL };
listid(id, &out);
outprintf(&out, "\tOUT%03d,%03d\r", u.row+u.nline, 0);
tpreturn(TPSUCCESS, 0, out.out, out.n, 0);
}
那这里就是用了另一个c文件中定义的listid(id, &out);,两个函数同名,在
c中允许这种情况?这个不是多态?另外请问extern "C" int listid(int id, OUT *);中extern "C"是什么意思呢?谢谢!
如果按照三楼的说法:
这不是两个函数,这是一个函数,extern "C" int listid(int id, OUT *);中的extren通知编译器int listid(int id, OUT *)不在本源代码中实现,"c"通知编译器用C调用方式调用在另外的一个源程序的函数

但这两个listid函数的参数不同也可以?可不可以认为这是一种变相的函数重载呢?

这不是两个函数,这是一个函数,extern "C" int listid(int id, OUT *);
中的extren通知编译器int listid(int id, OUT *)不在本源代码中实现,
"c"通知编译器用C调用方式调用在另外的一个源程序的函数,
C语言默认的调用方式就是C调用 C++就不同了,,所以最好加个"c"

另:调用方式规定了调用的时候输入参数的顺序和函数返回后输入参数占用的空间由调用程序释放还是由函数释放。这东西不一定要太懂,知道用"c"去考虑调用方式就可以了.

参数不同也是可以的,但是执行一定会有错误,而且应该不能出现同名不同参数的的令一个函数。要不连接的时候就找不到正确的函数。

首先你要看这两个函数的作用域在没有重叠,重叠就是非法的,extern "C" 是告诉编译器int listid(int id, OUT *);函数是以C方式编译的,可以用于C调用C++,或者C++调用C(具体看函数的定义)

C不支持函数重载。C标准规定在相同作用域内不能定义超过一个同名函数,否则视为标识符重复定义错误。
由于C++支持函数重载,因此同名函数可能有多个,链接时不只按函数名来区分函数。但C++的链接方式并不向下兼容,C代码写的函数用C++方式可能连接出错。extern "C"表示之后的一段代码是C代码,链接器采用C的方式来连接其中的函数。(可以在头文件中用#ifdef ... extern"C"{...#endif和#ifdef...}#endif的方法来控制,达到兼容C/C++的目的。)
----
[原创回答团]

1、C不支持函数重载。C标准规定在相同作用域内不能定义超过一个同名函数,否则视为标识符重复定义错误。
2、C++支持函数重载,因此同名函数可能有多个,链接时不只按函数名来区分函数。但C++的链接方式并不向下兼容,C代码写的函数用C++方式可能连接出错。extern "C"表示之后的一段代码是C代码,链接器采用C的方式来连接其