为何volatile变量可重复声明?附代码及编译现象解析
问题原因解析
代码与运行结果
你的代码如下:
#include <stdio.h> volatile int isInit_STD; volatile int isInit_STD; int main() { printf("v-%d-addr%x\n", isInit_STD, &isInit_STD); isInit_STD = 1; printf("v-%d-addr%x\n", isInit_STD, &isInit_STD); return 0; }
运行结果:
v-0-addr387fd040 v-1-addr387fd040
两次volatile声明能正常运行的原因
在C语言全局作用域中,volatile int isInit_STD;这种未初始化的变量声明属于暂定定义(tentative definition)。当你重复编写两次完全一致的暂定定义(包括volatile修饰符)时,编译器会自动将它们合并为一个单一的变量定义,最终两个声明指向同一块内存地址,因此程序可以正常编译运行。
一个带volatile一个不带会编译失败的原因
如果其中一次声明去掉volatile,变成int isInit_STD;和volatile int isInit_STD;,这两个声明的类型本质不同——一个是普通int类型,一个是带volatile修饰的int类型。此时编译器会判定你在全局作用域重复定义了两个不同类型的同名变量,违反了C语言“同一作用域下不能重复定义同名变量”的规则,因此直接报错,无法通过编译。
内容的提问来源于stack exchange,提问作者Doongbin
相关产品推荐
相关产品推荐

