| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 693 人关注过本帖
标题:为什么这段程序错了呢?
只看楼主 加入收藏
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
结帖率:81.71%
收藏
已结贴  问题点数:1 回复次数:5 
为什么这段程序错了呢?
e.h文件
extern "C" int ave();
e.c文件
int ave()
{
    return 1;
}
extern.cpp文件
#include<iostream>
#include "e.h"
int main()
{
    std::cout << ave();
}
报错原因:无法解析的外部命令ave???
请问有人知道吗
搜索更多相关主题的帖子: extern 文件 include 原因 int 
2023-03-09 13:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:1 
按理应该可以编译通过,你可以先去掉 extern "C" 试试能不能编译通过?

另外
extern "C" 与 extern 功能完全不同
extern "C" 是指示使用C语言的命名规则
extern 是指示使用外部连接
2023-03-09 16:50
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 2楼 rjsp
我在CSDN上和群里都问了,几个编程十年经验的人都说可以编译的,折腾了一下午后,终于知道什么原因了,在源文件前面也要加extern C
2023-03-09 17:00
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 3楼 后卿
因为你说了“e.h文件…巴拉巴拉…”,别人以为“e.c文件”中必然 #include "e.h" 了,提问时懒得写全

即,别人以为你说的是
程序代码:
extern "C" int ave();
int ave()
{
    return 1;
}
程序代码:
#include<iostream>
extern "C" int ave();
int main()
{
    std::cout << ave();
}


实际你说的却是
int ave()
{
    return 1;
}
程序代码:
#include<iostream>
extern "C" int ave();
int main()
{
    std::cout << ave();
}
2023-03-10 09:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
说说编译成功或失败的原因

extern "C" int ave();
int ave()
{
    return 1;
}
因为指定是使用C语言的命名规则,生成的目标文件中就有一个类似 ave_我是C连接符 的名字

int ave()
{
    return 1;
}
因为没指定使用C语言的命名规则,生成的目标文件中就有一个类似 ave_我是C++连接符 的名字

#include<iostream>
extern "C" int ave();
int main()
{
    std::cout << ave();
}
因为指定是使用C语言的命名规则,它会在目标文件中寻找类似 ave_我是C连接符 的名字


#include<iostream>
int main()
{
    std::cout << ave();
}
因为没指定使用C语言的命名规则,它会在目标文件中寻找类似 ave_我是C++连接符 的名字

--------------------------------

而C和C++的链接名不一样的原因是 C++支持重载,即 不同的函数在源代码中可以使用同一个名称,那么自然就需要在目标文件中区分开,实际使用不同的名称
比如
    int foo( int );
    int foo( double, double );
在C++中可以同时存在,因此它需要在编译时取个不同的名字,比如
    foo_这是参数为int的链接名
    foo_这是参数为double和double的链接名
而C语言不允许重载,那只需要简单的
    _foo

定义 和 调用 必须保证同名才会在 link 阶段找到
2023-03-10 09:40
后卿
Rank: 4
来 自:网络
等 级:业余侠客
威 望:1
帖 子:302
专家分:295
注 册:2016-10-22
收藏
得分:0 
回复 5楼 rjsp
ok,明白
2023-03-10 10:08
快速回复:为什么这段程序错了呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020586 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved