在一个文件中使用别的文件里面定义的全局函数必须要加extern吗?

zcm_xh2008 2013-10-21 12:46:10
vc6.0中两个文件的内容如下:
common.cpp:
bool g_test()
{
return true;
}


main.cpp:
#include<stdio.h>

bool g_test();

int main()
{
if(g_test())
{
printf("true\n");
}
else
{
printf("false\n");
}
return 0;
}
这样使用没问题,这个extern对于函数来讲是可以默认的吗?
...全文
856 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1
函数就不用加了,函数声明和函数定义很好区分,链接在本编译单元找不到该符号的定义的话,会在其它编译单元中寻找. 对于全局变量就不一样了 extern int a; 加extern 是声明,不加extern 就是定义了. 如果不加的话,编译器无法区分这到底是声明还是定义呀, 所以加个extern方便区分.
lm_whales 2013-10-22
  • 打赏
  • 举报
回复
很多人,会在函数体内,写extern T func() ;这样的函数声明,这种必要性非常小。 因为,只要把函数声明,函数参数中用到的类型的声明或定义, 写在.c,.cpp 的所有函数的定义前面,就可以使用,任何文件中定义的外部函数了。 而函数的存储类型,默认为 extern ,完全不必要,在函数体内,写外部函数声明。
lm_whales 2013-10-22
  • 打赏
  • 举报
回复
C 函数的存储类型,默认为 extern 所以 可以不加extern 一般外部变量要加extern ,不然会出现,命名冲突。 由于外部变量,独立的声明,也可以看作定义---即便没有初始化,所以要加extern ,表示在别处定义。 而函数,定义要加实现体,声明和定义具有完全不同的形式,而函数的存储类型,默认为 extern 所以,直接写函数声明,就相当于加了extern,加extern 就纯属多余了。
max_min_ 2013-10-22
  • 打赏
  • 举报
回复
引用 10 楼 zcm_xh2008 的回复:
引用 9 楼 max_min_ 的回复:
包含声明文件就好了!
蔷薇大神,我想知道这么做能正常运行的原因是什么?
在 C 里函数调用基本对应硬件指令, 需要处理参数压栈(顺序, 类型长度, 或寄存器传递), 返回值传递(返回类型, 栈还是寄存器传递)等各种问题. 不同的函数, 处理方式不一,所以需要前置申明函数原型的,减少代码不必要的问题!
zcm_xh2008 2013-10-22
  • 打赏
  • 举报
回复
引用 9 楼 max_min_ 的回复:
包含声明文件就好了!
蔷薇大神,我想知道这么做能正常运行的原因是什么?
max_min_ 2013-10-21
  • 打赏
  • 举报
回复
包含声明文件就好了!
风行踩火轮 2013-10-21
  • 打赏
  • 举报
回复
函数你没有在.h文件中声明,所以应该不规范,没有尝试过这样;但是全局变量肯定需要extern的
懒懒的吉他手 2013-10-21
  • 打赏
  • 举报
回复
函数不用,全局变量是要的,函数声明写在头文件里,定义写在cpp里,用的使用包含头文件就行了
Adol1111 2013-10-21
  • 打赏
  • 举报
回复
首先把声明部分放头文件里,然后把定义放在.c .cpp之类的文件中(定义中也要引入该头文件)。需要这个函数的时候引入相应的头文件,不然谁知道你的函数是哪里来的。 还有头文件里只放声明,不放定义。 最后,函数的话没必要加extern,全局变量的话需要加。
Sping 2013-10-21
  • 打赏
  • 举报
回复
引用 3 楼 zcm_xh2008 的回复:
[quote=引用 2 楼 ganpengjin1 的回复:]
需要加的,不然是属于不可见,无法连接到!

不啊,你看我的问题中的那个例子,我编译连接通过且运行正常。。。[/quote]

这里你这么写的确没错,原因不知道。。
但是你最好写成
common.h:
bool g_test();

main.cpp:
#include "common.h"
然后使用g_test。

文件包含文件比较坑爹,编译器不能保证一定能帮你找到。可能出现下面的情况

仅供参考



漫步者、 2013-10-21
  • 打赏
  • 举报
回复
引用 3 楼 zcm_xh2008 的回复:
[quote=引用 2 楼 ganpengjin1 的回复:] 需要加的,不然是属于不可见,无法连接到!
不啊,你看我的问题中的那个例子,我编译连接通过且运行正常。。。[/quote] sorry,我看成了全局变量,全局函数你应该这样写: 现在common.h中定义它,然后再common.cpp实现它,你再到你的main中去#include "your_file_path/common.h" 这个才是规范的。
zcm_xh2008 2013-10-21
  • 打赏
  • 举报
回复
引用 2 楼 ganpengjin1 的回复:
需要加的,不然是属于不可见,无法连接到!
不啊,你看我的问题中的那个例子,我编译连接通过且运行正常。。。
漫步者、 2013-10-21
  • 打赏
  • 举报
回复
需要加的,不然是属于不可见,无法连接到!
图灵狗 2013-10-21
  • 打赏
  • 举报
回复
对于函数来讲,加不加extern都是可以的。
引用 楼主 zcm_xh2008 的回复:
vc6.0中两个文件的内容如下: common.cpp: bool g_test() { return true; } main.cpp: #include<stdio.h> bool g_test(); int main() { if(g_test()) { printf("true\n"); } else { printf("false\n"); } return 0; } 这样使用没问题,这个extern对于函数来讲是可以默认的吗?

64,687

社区成员

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

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