全局变量不能定义在“被多个.c文件引用的.h文件”中

2024-06-14 06:32

本文主要是介绍全局变量不能定义在“被多个.c文件引用的.h文件”中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自: https://blog.csdn.net/basstal/article/details/52275191

全局变量global定义在头文件中,因为所有定义预设为外部链接,所以在头文件被.c文件包含以后,等于有两个或更多同等定义的global存在于不同的翻译单元,编译器发现不了错误,因为编译器每次是以翻译单元运作的。但是,链接器会在解析交叉引用时报告“符号被多重定义”错误。

//DefineGlobal.h
int global;
//GlobalTest1.c
#include "DefineGlobal.h"
//GlobalTest2.c
#include "DefineGlobal.h"
E:\cpp\牛客网>g++ -std=c++11 DefineGlobal.h GlobalTest1.c GlobalTest2.c
C:\Users\\AppData\Local\Temp\ccseJhV1.o:GlobalTest2.c:(.bss+0x0): multiple definition of `global'
C:\Users\\AppData\Local\Temp\cccqfbA0.o:GlobalTest1.c:(.bss+0x0): first defined here
  • 当把(所谓的)全局变量global定义为static时,由于static使定义的变量称为内部链接,所以在各个.c文件中,存在多个同名global但不同等的定义,每个翻译单元中的global维持自己的内存区域,此时链接器不会报告“符号被多重定义”错误。
//DefineGlobal.h
#ifndef DEFINEGLOBAL_H
#define DEFINEGLOBAL_Hstatic int global;#endif
//GlobalTest1.c
#include <iostream>
#include "DefineGlobal.h"void print1()
{global = 1;std::cout<<"print1 : "<<global<<std::endl;
}
//GlobalTest2.c
#include <iostream>
#include "DefineGlobal.h"void print2()
{std::cout<<"print2 : "<<global<<std::endl;global = 2;std::cout<<"print2 : "<<global<<std::endl;}
//GlobalMain.c
extern void print1();
extern void print2();int main()
{print1();print2();return 0;
}
//输出
print1 : 1
print2 : 0
print2 : 2
  • 此时,(所谓的)全局变量并没有达到一般意义上全局变量的效果,相当于每个翻译单元的局部变量。

结论: 

全局变量不能定义在被多个.c文件包含的头文件中


在某.c文件中声明的全局变量需要在其他.c文件中使用时,可以使用extern关键字。


这篇关于全局变量不能定义在“被多个.c文件引用的.h文件”中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059636

相关文章

电脑软件不能安装到C盘? 真相颠覆你的认知!

《电脑软件不能安装到C盘?真相颠覆你的认知!》很多人习惯把软件装到D盘、E盘,刻意绕开C盘,这种习惯从哪来?让我们用数据和案例,拆解背后的3大原因... 我身边不少朋友,在使用电脑安装软件的时候,总是习惯性的把软件安装到D盘或者E盘等位置,刻意避开C盘。如果你也有这样的习惯,或者不明白为什么要这么做,那么我

Java资源管理和引用体系的使用详解

《Java资源管理和引用体系的使用详解》:本文主要介绍Java资源管理和引用体系的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Java的引用体系1、强引用 (Strong Reference)2、软引用 (Soft Reference)3、弱引用 (W

vscode不能打开终端问题的解决办法

《vscode不能打开终端问题的解决办法》:本文主要介绍vscode不能打开终端问题的解决办法,问题的根源是Windows的安全软件限制了PowerShell的运行,而VSCode默认使用Powe... 遇到vscode不能打开终端问题,一直以为是安全软件限制问题,也没搜到解决方案,因为影响也不大,就没有管

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Python中局部变量和全局变量举例详解

《Python中局部变量和全局变量举例详解》:本文主要介绍如何通过一个简单的Python代码示例来解释命名空间和作用域的概念,它详细说明了内置名称、全局名称、局部名称以及它们之间的查找顺序,文中通... 目录引入例子拆解源码运行结果如下图代码解析 python3命名空间和作用域命名空间命名空间查找顺序命名空

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh