为什么我没有收到多重定义错误?

问题描述 投票:0回答:1
#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

c static global
1个回答
0
投票

来自 C17,6.2.1(标识符的范围),第 4 段:

…如果一个标识符在同一名称空间中指定两个不同的实体,则范围可能会重叠。如果是这样,一个实体的范围(内部范围)将严格在另一实体的范围(外部范围)之前结束。 在内部范围内,标识符指定在 内部范围;在外部作用域中声明的实体在内部作用域内是隐藏(并且不可见)。

(强调我的。)

© www.soinside.com 2019 - 2024. All rights reserved.