Possible Duplicate:
Static vs global

我对全局变量和静态全局变量之间的区别感到困惑.如果static意味着这个变量仅对同一个文件是全局变量,那么为什么在两个不同的文件中,相同的名称会导致名称冲突?

有人能解释一下这个吗?

推荐答案

创建链接器可用于其他文件的.o文件时,会出现全局变量(不是static).因此,如果您有两个这样的文件,您将在a上获得名称冲突:

a、 c:

#include <stdio.h>

int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

卑诗省:

int a;

int compute(void)
{
    a = 0;
    return a;
}

因为链接器不知道该使用全球a强中的哪一个.

然而,当您定义静态全局变量时,您告诉编译器仅为该文件保留变量,并且不要让链接器知道它.因此,如果在我编写的两个示例代码中添加static(在a的定义中),就不会出现名称冲突,因为链接器甚至不知道这两个文件中都有a:

a、 c:

#include <stdio.h>

static int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

卑诗省:

static int a;

int compute(void)
{
    a = 0;
    return a;
}

这意味着每个文件都使用自己的a,而不知道其他文件.


顺便说一句,其中一个是static,另一个只要在不同的文件中就可以了.如果两个声明在同一个文件中(读取translation unit),一个static和一个extern,请参阅this answer.

C++相关问答推荐

为什么这个select()会阻止?

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

VS代码C/C++扩展intellisense无法检测环境特定函数'

带有sigLongjMP中断I/O的异常处理程序

为什么我一直收到分段错误?

解决S随机内存分配问题,实现跨进程高效数据共享

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

在句子中转换单词的问题

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

将字符串数组传递给C中的函数:`str[dim1][str_size]`vs`*str[dim1]`

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

在C中创建任意类型的只读指针参数

如何将两个uint32_t值交织成一个uint64_t?

静态初始化顺序失败是否适用于C语言?

Linux分段故障(核心转储)

为什么二进制文件的大小不会随着静态数据的大小而增加?

强制GCC始终加载常量(即只读),即使启用了优化

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

为什么 Linux 共享库 .so 在内存中可能比在磁盘上大?

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?