c - 在 C 中,如何将全局变量的范围限制在声明它的文件中?

标签 c scope

我是 C 的新手。我面前有一本书解释了 C 的“文件范围”,包括示例代码。但是代码只声明和初始化一个文件范围的变量——它不会通过尝试以非法方式访问它来验证变量的范围。所以!本着科学精神,我构建了一个实验。

文件bar.c:

static char fileScopedVariable[] = "asdf";

文件 foo.c:

#include <stdio.h>
#include "bar.c"

main()
    {
    printf("%s\n", fileScopedVariable);
    }

根据我的书和 Google 的说法,对 printf() 的调用应该会失败,但事实并非如此。 foo.exe 输出字符串“asdf”并正常终止。我非常想使用文件范围。我错过了什么?

最佳答案

您 #included bar.c,它的作用是导致预处理器在编译器接触它之前将 bar.c 的内容逐字复制到 foo.c 中。

尝试去掉 include,但告诉你的编译器编译这两个文件(例如 gcc foo.c bar.c)并观察它如你所料的报错。

编辑:我想主要的混淆是在编译器和预处理器之间。语言规则由编译器强制执行。预处理器在编译器之前运行,并作用于那些以# 为前缀的命令。预处理器所做的只是处理纯文本。它不会解析代码或尝试以任何方式解释代码的含义。 “#include”指令非常直白——它告诉预处理器“在此处插入此文件的内容”。这就是为什么您通常只在 .h(头文件)文件上使用#include,并且只在头文件中放置函数原型(prototype)和外部变量声明。否则,您最终将多次编译相同的函数或定义相同的变量,这是不合法的。

关于c - 在 C 中,如何将全局变量的范围限制在声明它的文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1046546/

相关文章:

rust - 如何访问 `if let` 表达式之外的变量?

c - 在循环中逐个字符读取二维数组

ios - 我可以将任务分配给 iOS 中的特定核心吗?

c - 有时HPUX和Solaris中的LD_PRELOAD无法生效

c++ - 指向限定和非限定类型表示的指针

javascript - 当对象非常多并且我试图在范围内访问它时,为什么我会得到 "Can not read property 0 of undefined"?

C 控制台应用程序和 Qt gui 之间的通信

batch-file - 批处理文件变量范围问题

javascript - 将变量值传递给 AngularJs 1.X 中的数组参数

Javascript 命名空间和范围 : need clarification