常见的全局变量定义

本文详细介绍了全局变量的定义和作用域,包括文件内的全局常量和工程级别的全局常量。强调了const关键字的用法,解释了const修饰指针和指针修饰const的区别,并讨论了static如何限制变量的作用域。extern用于在不同文件间共享全局变量,防止重复定义的问题。同时,文中提供了C语言中const*和*const的用法示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的全局变量定义

作用域在文件内全局常量

// Test.m
static NSString *const kTestKey = @"test_key"; // 只作用于当前Test.m文件

作用域在工程的全局常量

// Test.h
extern NSString *const kTestKey;

// Test.m
NSString *const kTestKey = @"test_key"; // 作用于整个工程,在需要用到该变量的地方包含Test.h头文件即可

注意

  • 定义变量永远都不应该出现在头文件中,因为如果被包含多次,就会出现变量重定义错误。
  • 头文件中只能出现包含extern关键字的变量声明。

关键字解读

const

  • NSInteger const a = 3;
  • const NSInteger a = 3;

上面两种写法是等效的因为 NSInteger const 等价于 const NSInteger。

  • const NSString *str = @"abc";
  • NSString const *str = @"abc";
  • NSString *const str = @"abc"; // 正确写法

同样,上面第一种和第二种写法是等效的,项目中如果出现前两种写法,大多都不是符合预期的写法,因为str的值依然可以改变。

第三种写法才符合要使用的const的预期,这时候不允许再给str赋值。因为 NSString const * 表示指向 NSString const 的指针,NSString *const 表示指向 NSString 的const指针。

指针被声明为const后,将不允许被重新赋值,否则会编译错误。

static

static除了声明变量为静态变量外,还有一个作用,就是声明作用域在文件内的全局变量。

下面代码声明kTestKey为作用域在当前文件的全局变量:

  • static NSString *const kTestKey = @"test_key";

如果不加static,则表示kTestKey为作用域在整个工程的全局变量。假如工程中其它地方也定义了相同的kTestKey全局变量,就会出现变量重复定义编译失败问题。

extern

如果在Test.m文件中定义了如下全局变量:

  • NSString *const kTestKey = @"test_key";

那么就应该在Test.h文件中进行如下声明,表示该全局变量已经被定义过了:

  • extern NSString *const kTestKey;

如果工程其它位置需要用到kTestKey全局变量,则在.m文件中包含Test.h文件即可(也可以不包含Test.h,直接在.m文件中extern声明就可以使用,但是这样不便于管理)。

C语言中的 const* 和 *const

  • int* - 指向int的指针
  • int const * - 指向const int的指针
  • int * const - 指向int的const指针
  • int const * const - 指向const int的const指针

const放在类型两边是等价的,所以:

  • const int * 等价于 int const *
  • const int * const 等价于 int const * const

下面是一段测试代码:

// const int *a
int b = 1;
const int *a = &b;
int c = 2;
a = &c;
*a = 3; // 编译失败,因为a是指向const int的指针

// int *const a
int b = 1;
int *const a = &b;
int c = 2;
a = &c; // 编译失败,因为a是指向int的const指针
*a = 3;

// const int *const a
int b = 1;
const int *const a;
int c = 2;
a = &c; // 编译失败,因为a是指向const int的const指针
*a = 3; // 编译失败,因为a是指向const int的const指针

参考链接

<think>嗯,用户想了解全局变量定义和用法。首先,我得回忆一下全局变量的基本概念。全局变量是在整个程序中都有效的变量,可以在任何函数或模块中访问,对吧?那它的定义方法在不同编程语言里可能有所不同,比如C、Python或者JavaScript。 记得在C语言中,全局变量通常是在函数外部定义的,这样所有函数都能访问。比如在引用3里提到的例子,int g_nShape=0; 这样的定义。而Python的话,需要在函数内部用global关键字声明,像引用1里说的,函数里用global x来修改全局变量。 接下来,用户可能想知道如何正确使用全局变量。使用不当会导致代码难以维护,比如在多个地方修改同一个变量,容易引发bug。需要强调合理使用,避免滥用。比如在QT编程中,引用2提到在头文件里声明extern,然后在源文件里定义,这样其他文件就能用了。 还要注意不同语言的作用域规则。比如JavaScript的全局变量是挂在window对象上的,而模块化开发中可能用闭包来避免污染全局空间。像Node.js中用global对象,或者ES6的模块作用域。 可能用户会遇到的问题包括变量命名冲突、意外的修改,这些都要提醒。另外,多线程环境下全局变量的同步问题,比如加锁机制,引用4里提到的STM32多文件定义方法,可能涉及到硬件编程中的注意事项。 最后,生成相关问题的时候,要覆盖定义方法、优缺点、语言差异、多线程和替代方案,这样用户能全面了解。还要确保引用正确的来源,比如Python的问题对应引用1,C语言对应3和4,QT对应2。 总结一下,回答的结构应该先定义,再使用方法,分语言讲解,注意事项,最后应用场景。这样用户能一步步理解全局变量的核心知识点。</think>### 全局变量定义与使用详解 #### 一、全局变量定义 全局变量是在程序的**整个作用域**内均可访问的变量,其生命周期从程序启动到结束。定义方式因编程语言而异: 1. **C语言**:在函数外部直接定义 ```c int global_var = 10; // 文件作用域的全局变量 ``` 跨文件使用时需配合`extern`声明(见引用[3][^3]): ```c extern int global_var; // 其他文件中声明 ``` 2. **Python**:在函数外定义,函数内通过`global`关键字声明修改(引用[1][^1]): ```python x = 10 def func(): global x x = 20 ``` 3. **JavaScript**:直接定义或通过`window`对象: ```javascript var globalVar = "data"; // 浏览器环境 window.globalVar = "data"; // 显式声明 ``` #### 二、全局变量的使用方法 1. **跨模块共享数据**(引用[2][^2]): - 在头文件`global.h`中声明: ```cpp extern QString appConfig; ``` - 在源文件`global.cpp`中定义: ```cpp QString appConfig = "default"; ``` 2. **硬件编程场景**(引用[4][^4]): ```c // SlaveMap.h extern uint8_t SlaveMap[32]; // SlaveMap.c uint8_t SlaveMap[32] = {0}; ``` 3. **状态跟踪**: ```python game_score = 0 # 跟踪游戏得分 def add_score(): global game_score game_score += 10 ``` #### 三、注意事项 1. **命名规范**:建议加`g_`或`global_`前缀(如`g_nShape`) 2. **线程安全**:多线程环境需加锁保护 3. **耦合度控制**:过度使用会降低代码可维护性 4. **初始化问题**:C语言中未初始化的全局变量默认为0 #### 四、应用场景 1. 程序配置参数(如QT的界面设置) 2. 硬件寄存器映射(STM32开发[^4]) 3. 游戏状态管理(俄罗斯方块形状记录[^3]) 4. 跨模块通信桥梁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值