关于链接器的函数匹配原则

htqx 2007-01-27 08:37:39

以前我以为和函数重载是一回事.
但是今天测试了一下,只要返回值不同,也不算链接错误.

这到底是怎么回事?

谁有更加详细的资料?
...全文
314 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
htqx 2008-10-04
  • 打赏
  • 举报
回复


这个的原因:

c++语法上不能识别返回值,但是连接器可以识别。
对于连接器来说,不同返回值是不同函数。

doudouHuY 2007-01-29
  • 打赏
  • 举报
回复
两个文件里头的func,没特殊修饰,都是全局域。
应该是命名修饰做的手脚
晨星 2007-01-29
  • 打赏
  • 举报
回复
这个不是冲突,是重定义吧。
即使b.cpp中也是return 0;连接器也同样报错。
htqx 2007-01-29
  • 打赏
  • 举报
回复
那如何解释:
a.cpp
int func() { return 0;}

b.cpp
int func() { return 1; }

是相冲突的?
lidongri 2007-01-29
  • 打赏
  • 举报
回复
那是作用域不同造成的
编译器的命名类似于
func@a
func@b
但在同一个文件里就会出现错误
lidongri 2007-01-29
  • 打赏
  • 举报
回复
命名修饰和上面说的类似
htqx 2007-01-28
  • 打赏
  • 举报
回复
比如
a.cpp 定义:
void func(){return;}

b.cpp
int func() { return 1; }

vc链接不报错.
htqx 2007-01-28
  • 打赏
  • 举报
回复
要讨论的不是重载,而是否连接器将同名,同参数列表,不同返回值的函数视为不同的两个函数.
OOPhaisky 2007-01-28
  • 打赏
  • 举报
回复
参数不同不可能相同的(这样违反了c++的重载语法的基本要求).
---------------------------------------------------------------------------------
C++编译器会对函数进行“名称重整”的,重整之后的名称就会反映出参数列表的不同。
lidongri 2007-01-28
  • 打赏
  • 举报
回复
重载与返回值无关
例如:
void Draw();

int Draw();
编译器就会报错

void Draw();
void Draw(int i);

void Draw();
int Draw(int i);
就不会
todototry 2007-01-28
  • 打赏
  • 举报
回复
只要返回值不同,也不算链接错误.
==============================
会报错
htqx 2007-01-28
  • 打赏
  • 举报
回复
参数不同不可能相同的(这样违反了c++的重载语法的基本要求).
只是将返回值归入考量,还真是有点意外,不知道是不是vc自己的特点.
SammyLan 2007-01-28
  • 打赏
  • 举报
回复
链接器链接只要"名字"完全一样就OK了
一般编译器对函数的命名修饰根据不同调用方式有不同的命名修饰方法,但是都是跟函数名和参数有关系,而且参数里面也不包含参数类型信息,只包含参数的总字节大小信息
所以链接阶段应该跟返回值没关系,但是估计连跟参数也没关系......
不知道对不

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧