#include <stdio.h>
#define MAX 5
static int data = 10;
int increment(void *);
int increment(void *ptr)
{
int *p = ptr;
static int data =15;
for (int loop=0; loop < MAX; loop++)
{
data++;
}
return data;
}
int main(void)
{
printf("%d\n", data++);
static int data = 25;
for (int loop=0; loop < MAX ; loop++)
{
data++;
}
printf("%d\n", data++);
data = increment(&data);
printf("%d\n", data++);
return 1;
}
我知道,静态会保留在内存中,直到程序结束。然后在上面的代码中有一个全局的
static int data
和main中相同的static int data
。在增量函数中,我知道它具有局部作用域。
根据我的说法,它应该给出多个定义错误。但它没有给出。为什么? 程序如何识别这里我必须采用 global
data
而这里我必须采用 main data
?
来自 C17,6.2.1(标识符的范围),第 4 段:
…如果一个标识符在同一名称空间中指定两个不同的实体,则范围可能会重叠。如果是这样,一个实体的范围(内部范围)将严格在另一实体的范围(外部范围)之前结束。 在内部范围内,标识符指定在 内部范围;在外部作用域中声明的实体在内部作用域内是隐藏(并且不可见)。
(强调我的。)