在 C 语言中,变量可以具有不同的作用域:局部(在块内)、全局(在整个文件中)以及文件范围内的作用域(static)。正确管理作用域对于可预测的行为和避免名称冲突至关重要。
在文件的所有函数中可见,如果使用 extern 声明,则在整个项目中可见。
在进入块(例如函数或循环)时创建。在声明块外不可见。
static int foo; —— 仅在当前文件内可用。
示例:
static int counter = 0; // 仅在文件内可见 void increment() { int temp = 10; // 局部变量 ++counter; }
如果全局和局部变量具有相同的名称,函数内部使用的是哪个变量,为什么?
答案: 使用局部变量,因为它在其作用域内“遮蔽”(shadowing)了全局名称。全局变量仍然可以在局部变量声明块外部访问。
示例:
int value = 5; void foo() { int value = 10; printf("%d", value); // 将输出 10,而不是 5 }
故事
故事
static,这导致在链接时出现名称冲突,以及在构建项目的不同部分时出现不可预测的错误。故事
存在全局变量在多线程代码中未进行适当同步的情况。由于隐式作用域和在不同线程中修改值时的不注意,导致数据竞态(data race)发生。