头文件中不能定义变量
变量 定义 不能 头文件
2023-09-11 14:15:08 时间
头文件中定义全局变量会出现的问题
=====本文转载的,在工作中,很受用,特此记录之。======
直接在头文件中定义全局变量,然后有多个文件包含这个头文件时,编译通过不了,提示重复定义变量!
在头文件中定义全局变量时前面加上关键字static,此时编译会通过但是此时全局变量的作用域不是我们想要的结果!
测试:
/* 再头文件中定义一个全局变量 */
static int a = 0;
/* 然后在两个包含了此头文件的C文件中分别打印这个变量的地址 */
printf("&a = %x\n", (uint)&a);
测试结果你会发现 两个地址不一样 !!原因是它在每个源文件中都有一份这个变量的拷贝,而不是共用一个变量。它的作用域只在一个源文件中,而不是我们想要的跨文件的全局变量。
怎样得到真正的全局变量?
在其中一个源文件中定义一个全局变量
在其他源文件中使用 extern 声明此变量,就可以使用了
或者在 头文件 中使用 extern 声明此变量,然后在需要使用这个变量的源文件中包含此头文件
例如:
/* 在其中一个源文件中定义一个全局变量 */
int a = 0;
/* 在其他源文件或者头文件中使用 extern
声明此变量 */
extern int a;
特别注意 结构体变量
在GCC编译环境下,在头文件中直接定义全局结构体变量是可以的。编译时不会报错,而且它在所有包含这个头文件的源文件中共用一个变量。
而在windows中的VS编译环境下,不能直接在头文件中定义全局结构体变量,会和普通变量一样报错,提示重复定义变量!
/* 在头文件中定义一个全局结构体变量 */
struct test{
int a;
char b;
};
struct test test_1;
注:这些结果都是我亲自动手测试过的
所使用的GCC版本:gcc version 4.8.2
所使用的VS版本:VS2010
所以建议不要在头文件中定义任何变量
转自
相关文章
- 《征服 C 指针》摘录2:C变量的 作用域 和 生命周期(存储期)
- 【C语言入门教程】4.5 指针变量的定义与引用
- Python函数详解(一)——函数的定义、调用及变量
- Go中的函数也是一种数据类型,可以赋值给一个变量
- 【STM32F4029开发板用户手册】第9章 STM32F429重要知识点数据类型,变量和堆栈
- Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
- 微搭低代码从入门到精通05-变量定义
- ML之FE:IV信息量(Information Value)指标(衡量变量的预测能力)的简介、计算逻辑、使用方法之详细攻略
- DataScience&ML:金融科技领域之风控的简介、类别、应用流程(定义目标变量→特征构建思路等)、案例集锦之详细攻略
- TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测
- Java 8 lambda表达式中为什么要求外部变量为final
- 习题 7.1 定义一个结构体变量(包括年、月、日),编写程序,要求输入年、月、日,程序能计算并输出该日在本年中是第几天。注意闰年问题。
- c语言之定义变量的一种写法
- Qt一个project调用还有一个project的类成员变量
- 002-shell变量定义、使用、字符串替换,分隔,搜索、数组、注释
- 关于在php中变量少写了一个$和页面不断转圈的问题排查和vim的自动补全方式
- iOS 在类实现定义中声明成员变量的怪异方式
- 尽可能在定义变量的同时初始化该变量
- JavaScript基础(一)js环境搭建、变量常量、数据类型及转换、运算符
- Python-Tensorflow基础(二)变量 Fetch Feed 使用
- kitten编程猫 在线课程第八讲要点 - 变量的使用
- Shell基础— 变量定义的规则和分类