BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #96009同步于 2017/8/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

多源文件的疑惑

Bingley
2017/8/16镜像同步12 回复
更新: 在楼里各位的指导下用gcc也试了下: 函数定义默认为extern属性,函数定义在文件1的时候,文件2可以不用声明即可调用(为了更清楚的表明使用了定义在别处的函数,可以用extern关键字再次声明函数)。而文件2调用文件1中的变量则必须extern关键字声明~ ------------------------ 原文: 一直混杂的学着c和c++,之前没怎么用过多个文件的情况。有些地方很不懂啊,网上也不好找答案。。。 我在vs2010中创建了工程: variable.h: int a=10; fun.h: void fun(); fun.c: #include<stdio.h> #include"variable.h" #include"fun.h" void fun(){ printf("函数调用!\n"); printf("%d\n",a); } main.c中: int main(void){ fun(); } 这时fun会有波浪线提示未定义,但编译运行还是能正常执行fun函数的功能啊。这里没用extern声明怎么也成功调用了其他文件的函数?(问题1) (问题2)把main.c改成如下形式就不行了,为啥函数可以,变量不行?(还是只是因为编译器的原因?) #include<stdio.h> int main(void){ fun(); printf("%d\n",a); }//错误提示为fun和test都为声明。 ps(问题3)瞎搞出现不解之处。定义全局变量后再对全局变量赋值为什么行不通?(赋值操作紧跟着定义后面,在函数外面,)纸上得来终觉浅,绝知此事问论坛~~~~~ 谢谢~~~
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Bingley机器人#1 · 2017/8/16
@nuanyangyang
Ncer机器人#2 · 2017/8/16
函数默认是extern的。。。 最后一个问题。。。在c语言在函数外面当然不能赋值了。。。
wjy1230机器人#3 · 2017/8/16
第一个问题,可能是msvc编译器比较智能,所有成功编译。这个应该是和编译器有关的,你用gcc编译应该就会报错。 第二个问题,#include”variable.h”和“fun.h”应该就可以了 第三个问题,在函数体外面当然不能声明变量后再赋值。就好比你定义了一个类,在函数体外面,要么使用构造函数进行初始化,要么用重载的拷贝赋值运算符进行拷贝初始化。 通过『我邮2.0』发布
Bingley机器人#4 · 2017/8/16
在fun.c中定义的时候默认为extern,但在mian.c调用的时候没用extern引用声明啊 【 在 Ncer 的大作中提到: 】 : 函数默认是extern的。。。 : 最后一个问题。。。在c语言在函数外面当然不能赋值了。。。
Bingley机器人#5 · 2017/8/16
谢谢~第二个问题中,函数和变量都是同样的处理,只有函数的话就能调用成功加上变量就不行了,。。如果确实是编译器的问题话,为什么函数可以,变量却不行?(也可能就是编译器问题有点说不清了)。 【 在 wjy1230 的大作中提到: 】 : 第一个问题,可能是msvc编译器比较智能,所有成功编译。这个应该是和编译器有关的,你用gcc编译应该就会报错。 : 第二个问题,#include”variable.h”和“fun.h”应该就可以了 : 第三个问题,在函数体外面当然不能声明变量后再赋值。就好比你定义了一个类,在函数体外面,要么使用构造函数进行初始化,要么用重载的拷贝赋值运算符进行拷贝初始化。 : ...................
wzh666机器人#6 · 2017/8/16
首先,第一个问题里面,理论上要有函数声明才能调用外部函数,而且不用写extern,函数在定义的时候如果前面不写限定作用域的关键字,默认是extern,外部文件调用只要有声明即可,你这里没有include fun.h,会报错,链接的时候应该会出问题,能运行的确应该是编译器的行为,同意三楼的说法,第二个问题,理论上在.h文件中不能出现变量的定义,只能存在声明。在C语言里,定义和声明是比较模糊的,如果在一个作用域下,写 int a;作用是定义并声明。而在不同作用域下,对于外部变量的使用需要先声明再使用,C语言里声明外部变量和函数有所不同,函数默认extern,外部变量却需要明确写出extern来表明是外部变量的声明,而且当然了,这个声明就不能有赋值行为,直接extern int a; 你这个a,应该在另一个.c文件中定义,然后在要用的文件中直接写extern int a;进行声明,或者在另一个.h中写声明,其他文件include,如果在.h文件中直接写定义,也不是不对,如果没有做防止重复include的操作的话(就如你的.h),这样会变成include这个文件的所有.c文件都有自己作用域的一个a变量,而不是所谓的外部变量,之前你的疑问是既然编译器对函数链接做了优化,为啥外部变量不做,因为变量必须有extern去声明编译器才会去其他文件找变量定义,随便去找外部变量是不安全的行为,我个人觉得函数也不应该有编译器去找的,你可以试试在两个.c文件里定义相同名字函数,没有其他地方对其有调用,也不要写声明,编译链接看看会不会有问题,如果报错,那原因更明显了,C语言里在函数层面是不允许有重名的,而变量在不同的文件中作用域是不同的,所以在不同作用域中定义的变量可以同名。第三个问题。。。C语言的可执行语句必须在函数里面,像定义,声明等语句,最终在机器里没有对应的动作,都是编译器在处理,变成寄存器或内存地址
nuanyangyang机器人#7 · 2017/8/16
C语言默认是extern,c++默认是static。微妙的区别。 【 在 Ncer 的大作中提到: 】 : 函数默认是extern的。。。 : 最后一个问题。。。在c语言在函数外面当然不能赋值了。。。
nuanyangyang机器人#8 · 2017/8/16
main.c里请#include "fun.h"
q1414998074机器人#9 · 2017/8/16
@zc199102 @chaoshen 发自「贵邮」