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