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

地址: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.解决方法:

假设工程中的多个源文件需要这个全局变量,那么你就任找一个源文件,把这个全局变量定义到这个源文件中,然后新建一个头文件,在里面进行extern 这个变量的声明,最后在需要使用这个全局变量的源文件中include你新建的头文件就OK了。

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

原文地址:https://www.cnblogs.com/Stephen-Qin/p/11514804.html

时间: 2024-08-27 22:01:57

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

c语言头文件中定义全局变量的问题

问题是这么开始的: 最近在看一个PHP的扩展源码,编译的时候的遇到一个问题: ld: 1 duplicate symbol for architecture x86_64 仔细看了一下源码,发现在头文件中 出现了全局变量的定义. 简化一下后,可以这么理解: // t1.h #ifndef T1_H #define T1_H int a = 0; #endif //------------------ //t1.c #include "t1.h" #include "t2.h&

解决头文件中定义全局变量MSVC、GNU编译器出现重定义问题

有时候我们经常碰到这样的事情,想定义某个类的静态成员,在头文件中定义该成员或者全局变量,头文件又同时被多个文件引用到,链接的时候则会出现,重定义,但是又不想在cpp文件中定义,现有一种方法可以解决此问题,直接上代码 #if defined(_MSC_VER ) __declspec(selectany) #elif defined(__GNUC__) __attribute__((weak)) #else #error "unknown complier" #endif int a=1

C语言头文件中定义全局变量导致重复定义错误

合作方升级SDK后,程序编译出现变量重复定义的错误,通过错误提示无法找到什么位置重复定义了,但确定是引入新SDK后才出现的错误,从SDK的头文件中查找,最终发现在头文件中定义了全局变量 我们的项目在多个头文件中include了SDK的头文件,所以相当于这个全局变量在多个头文件中定义了,因此报错. 总结:头文件不要有任何全局变量的定义出现

C语言之在头文件中定义全局变量

通常情况下,都是在C文件中定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的C文件使用的话,那么将全局变量定义在头文件里面会方便很多,那到底是如何实现的? os_var.c文件内容 1 #define OS_GLOBALS 2 #include “os.h” os.h文件内容 1 #ifdef OS_GLOBALS 2 #define OS_EXT 3 #else 4 #define OS_EXT extern 5 #endif os.h中定义很多的全局变量,但是os.h又需

关于在头文件中定义变量的问题

如果在一个头文件中定义了一个变量 A.h: int i; 在A.cpp,B.cpp...文件中包含了这个头文件,编译时就会产生重复定义的错误.问题所在是因为int i;这句代码是定义了一个i变量,包含一次头文件就定义了一次i,包含多次肯定引起错误.如果改成extern int i;这句代码就变成了一个声明了.并不会定义i这个变量.不过在多个cpp文件里初始化一样会出现错误.只能在一个cpp文件中进行初始化.

c语言头文件中定义变量

最近在看一个PHP的扩展源码,编译的时候的遇到一个问题: ld: 1 duplicate symbol for architecture x86_64 仔细看了一下源码,发现在头文件中 出现了全局变量的定义 ZEND_DECLARE_MODULE_GLOBALS(xx) 简单开来,可以这么理解 // t1.h #ifndef T1_H #define T1_H int a = 0; #endif //------------------ //t1.c #include "t1.h" #

C++ vector 实现二维数组时, 在类的头文件中定义时遇到"应输入类型符"的问题?

见下,当我在类的声明文件中定义二维vector时,提示我应输入类型说明符; 但是相同的格式定义,在类中将二维vector修改为在源文件中定义就可以顺利通过,并顺利执行打印 打印结果如下: 望大神来解惑!

在C的头文件中定义的结构体,如何在cpp文件中引用

解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dialog3.h" #include <QDebug> extern "C" { typedef struct PRINT { unsigned char Parameters;//BitDepthAC,BitDepthDC,q unsigned char PlaneCo

如何在C++头文件中定义const成员变量?

------------------------------------------------------------------------------------ 一.必须在构造函数中初始化const成员变量. [email protected]:~/project/test/const-test/const4_cpp$ [email protected]:~/project/test/const-test/const4_cpp$ cat const.h -n 1  #ifndef CON