C标准说变量名不应该与标准C关键字和标准函数名匹配。那么,为什么下面的代码编译时没有错误呢?
#include <stdio.h>
int main()
{
int main = 10;
printf("Magic is %d", main);
return 0;
}
在下面的回答中,ouah写道
main
不是保留标识符,它允许在C中将变量命名为main
。
因此,考虑到下面的程序,这是否意味着fopen
也没有保留呢?
#include <stdio.h>
int main()
{
int fopen = 10;
printf("Magic is %d", fopen);
return 0;
}
发布于 2014-09-17 13:06:07
您的程序是一个有效的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)“所有具有外部链接的标识符(包括未来的库方向)和errno始终保留为具有外部链接的标识符。
但是fopen
变量标识符在示例程序中具有块范围和无链接。
发布于 2014-09-17 15:16:55
默认情况下,全局变量和函数本质上是extern
,而在块作用域中,它们默认为auto
。
若要检查链接器如何解析符号,请检查这里
https://stackoverflow.com/questions/25891387
复制相似问题