本人在学习外部变量的时候,发现 extern 类型名 变量名 这个格式既可以作为外部变量的定义,也可以作为对外部变量引用的声明,故产生疑问:C中怎么样判断本人是在定义外部变量还是在对本人即将引用的外部变量进行声明呢?
图一:
图二:
图三:
图四:
图五:
图二和图五中的程序一模一样,而且都是正确编译,但结果却迥然不同,本人想不仅本人糊涂了,估计编译器也懵逼了;
希望高手们能帮本人解释下以上五张图中的程序,解答下本人的疑问,谢谢!
图一:
图二:
图三:
图四:
图五:
图二和图五中的程序一模一样,而且都是正确编译,但结果却迥然不同,本人想不仅本人糊涂了,估计编译器也懵逼了;
希望高手们能帮本人解释下以上五张图中的程序,解答下本人的疑问,谢谢!
解决方案
20
纯粹的声明,好处是只有一处定义,不会出现定义不一致之处
声明 和定义写在一起,好处是 看到声明就知道定义
坏处是 ,可能出现定义不一致,特别是不同文件,都这样写的时候
至于编译器,假如见到定义,那就会忽略声明
假如有两处不同定义,那就会报错
假如相同,可能回都接受吧,
最多也就是报错
其实任取一处 ,作为定义即可。
声明 和定义写在一起,好处是 看到声明就知道定义
坏处是 ,可能出现定义不一致,特别是不同文件,都这样写的时候
至于编译器,假如见到定义,那就会忽略声明
假如有两处不同定义,那就会报错
假如相同,可能回都接受吧,
最多也就是报错
其实任取一处 ,作为定义即可。
10
另外,编译器还有强符号与弱符号的分别,来区分声明和定义
有初始化的,是强符号
无初始化的,是弱符号
有初始化的,是强符号
无初始化的,是弱符号
10
全部是弱符号,任取一个作为定义
多个强符号,重复定义错误
多个强符号,重复定义错误