为什么将内置库函数声明为标识符名称是合法的?

时间:2016-02-12 15:29:44

标签: c

这是变量printf的声明:

int printf=90;

这样运行没有任何错误,但如果我尝试使用给定名称printf打印标识符的值,那么它会给出错误,那么为什么尽管编译器允许printf用作标识符但我们以后不能打印它的价值。

1 个答案:

答案 0 :(得分:6)

你的问题有些混乱。

C具有“范围规则”,用于控制如何从代码中的给定点解析名称(如printf)。根据范围规则, shadow 来自外部范围的名称是可能的,也是合法的。

通常printfextern - 从<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