能不能在头文件中定义全局变量?(转)

地址:https://blog.csdn.net/baidu_35679960/article/details/79200865

1、ANSI C标准是什么?GNU又是什么?ld是什么?

ANSI C是C语言的标准规范,是国际标准化组织制定的国际标准。

虽然 ANSI C规范了C语言的实现,但是在实际情况中,各家C语言提供商都会根据平台的不同情况对ANSI C进行一定的扩展。因此可以将现实中C语言实现看作是ANSI C的一个超集。比较有代表性的例子是linux的gcc编译器。由于该编译器对ANSI C进行了非常多的扩展,linux内核源码基本上只能在gcc上面 进行编译,希望通过其他的编译器来编译linux内核几乎是不可能的。

GNU计划,又称革奴计划。它的目标是创建一套完全自由的操作系统。1990年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs  。GCC(GNU Compiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器。

GNU工具链包括了构建linux开发环境所需的编译、链接、调试、软件工程等工具。GCC(编译器)、Gdb(调试器)、make(软件等工程工具)。GCC下包括gcc,g++工具。GNU binutils是一组二进制工具程序集,是辅助GCC的主要软件,包括我们熟悉的as(GNU汇编器),ar(建立、修改、提取归档文件,归档文件是包含多个文件内容的一个大文件)、ld(连接器,把目标文件和归档文件结合在一起),我们在写程序的时候,有时候报错:[Error] ld returned 1 exit status,这就是程序在链接的时候出错了。

2、C语言可以在不同的源文件中定义相同名字的全局变量吗?

 不使用static的时候,两个不同的源文件都可以正常编译,但会出现链接错误,原因是有两个地方存在相同的变量,导致编译器无法识别应该使用哪一个。

 关于全局变量的几点说明:

①默认情况下,C语言中的全局变量和函数的作用域仅限于定义和声明这个函数或变量的文件内部,如果需要从这个C文件之外访问这些函数或者全局变量就需要使用 extern关键字进行声明,这是因为C编译器是以C文件为单位进行编译的,如果这个C文件中引用了其他文件中定义的函数或者变量,编译器将无法找到这个函数或者变量的定义,从而给出该函数或者变量未定义的错误信息。

 ②static用于全局变量的声明时,作用类似于函数的情况,这个全局变量的作用域将局限在声明该变量的c文件内部,这个c文件之外的代码将无法访问这个变量。编译的时候将会出现类似undeference to "xxx"的报错,它是找不到xxx的,因为使用static相当于进行了文件隔离

 3、那么再引申另一个问题,能不能在头文件中定义全局变量?

 因为变量只能被定义一次,包含了头文件的源文件,都将会定义同样的全局变量,造成冲突,所以,头文件中不能定义全局变量。

4.解决方法:

假设工程中的多个源文件需要这个全局变量,那么你就任找一个a.h头文件,用extern去声明这个变量,然后源文件a.cpp中去定义它(注意这个是真正定义的地方,不再需要带extern),最后在需要使用这个全局变量的源文件中include"a.h"就OK了。(其他的cpp中为了程序的可读性, 最好还是加上extern声明) 例子:https://blog.csdn.net/MrZhangXX/article/details/84109902


————————————————
版权声明:本文为CSDN博主「十一月zz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_35679960/article/details/79200865

新战场:https://blog.csdn.net/Stephen___Qin
原文地址:https://www.cnblogs.com/Stephen-Qin/p/11514804.html