这是变量printf的声明:
int printf=90;
这样运行没有任何错误,但如果我尝试使用给定名称printf打印标识符的值,那么它会给出错误,那么为什么尽管编译器允许printf用作标识符但我们以后不能打印它的价值。
答案 0 :(得分:6)
你的问题有些混乱。
C具有“范围规则”,用于控制如何从代码中的给定点解析名称(如printf
)。根据范围规则, shadow 来自外部范围的名称是可能的,也是合法的。
通常printf
是extern
- 从<stdio.h>
声明,其值由链接器替换为标准库中的正确函数地址。
但是如果你声明一个这样的新变量,那么你就是在暗示这个名字。基本上,您将获得一个新类型的新变量,其名称与现有变量相同。然后,外部原始printf
无法从该范围访问,因为C没有范围解析运算符。在C ++中,您可以使用始终引用全局::printf
的{{1}}。 C没有那个。
您可以通过在隐藏它之前复制printf
的原始值来解决它:
printf
正如评论中所提到的,一旦您完成了本地变体,您可以将其重新声明为{
int (*theprintf)(const char *fmt, ...) = printf;
int printf = 90;
theprintf("now printf has the value %d\n", printf);
}
以将其恢复,但是您无法在同一范围内执行 < / EM>:
extern