C标准规定变量名称不应与标准C关键字和标准函数名称匹配。那么为什么下面的代码编译没有错误?
#include <stdio.h>
int main()
{
int main = 10;
printf("Magic is %d", main);
return 0;
}
在下面的answer中,ouah写道
中为
main
不是保留标识符,允许命名变量 在Cmain
所以考虑下面的程序,这是否意味着同样没有保留fopen
?
#include <stdio.h>
int main()
{
int fopen = 10;
printf("Magic is %d", fopen);
return 0;
}
答案 0 :(得分:32)
你的程序是一个有效的C程序。
main
不是保留标识符,允许在C中将变量命名为main
。
您不能做的是在文件范围内命名变量main
,但这与其他与同名函数冲突的变量相同:
这是无效的:
int main = 0;
int main(void)
{
}
出于同样的原因,这是无效的:
int foo = 0;
int foo(void)
{
return 0;
}
编辑:解决OP问题编辑,OP问题中的第二个程序也有效,因为C说
(C11,7.1.3p1)&#34;以下任何子条款(包括未来的库方向)和errno中具有外部链接的所有标识符始终保留用作标识符 外部联系。&#34;
但是fopen
变量标识符在示例程序中具有块范围和无链接。
答案 1 :(得分:1)
默认情况下,全局变量和函数本质上是extern
,而在块作用域中它们默认为auto
。
要检查链接器如何解析符号,请选中here