C main和fopen是有效的变量名吗?
C标准规定变量名不应与标准C关键字和标准函数名匹配。那么为什么下面的代码编译时没有错误呢C main和fopen是有效的变量名吗?,c,keyword,C,Keyword,C标准规定变量名不应与标准C关键字和标准函数名匹配。那么为什么下面的代码编译时没有错误呢 #include <stdio.h> int main() { int main = 10; printf("Magic is %d", main); return 0; } 您的程序是一个有效的C程序 main不是保留标识符,允许它在C中将变量命名为main 您不能在文件范围内命名变量main,但这与其他变量相同,这些变量可能与同名函数冲突: 这是无效的: int
#include <stdio.h>
int main()
{
int main = 10;
printf("Magic is %d", main);
return 0;
}
您的程序是一个有效的C程序
main
不是保留标识符,允许它在C中将变量命名为main
您不能在文件范围内命名变量main
,但这与其他变量相同,这些变量可能与同名函数冲突:
这是无效的:
int main = 0;
int main(void)
{
}
int foo = 0;
int foo(void)
{
return 0;
}
出于同样的原因,这是无效的:
int main = 0;
int main(void)
{
}
int foo = 0;
int foo(void)
{
return 0;
}
编辑:要解决OP问题编辑,OP问题中的第二个程序也有效,如C所述
(C11,7.1.3p1)“以下任何子条款(包括未来的库指令)中具有外部链接的所有标识符和errno始终保留用作具有外部链接的标识符
外部连接。”
但是
fopen
变量标识符在示例程序中具有块作用域且没有链接。默认情况下,全局变量和函数本质上是extern
,而在块作用域中,它们默认为auto
为了检查链接器如何解析符号,请检查C标准中的lotsa内容……有趣的是,一位Sjord Mullender在1984年的国际模糊C代码竞赛中采用了整个“作为全局变量的主”概念。查看它。还要注意,由于包含了
,fopen
可能是一个函数式宏。那么它就不能作为某些类型的变量进行移植(“严格一致”),特别是像fopen(无论什么)
那样调用的函数指针,因为这样会扩展宏。如果实现没有将其定义为宏,或者您从未在(
,因此这是一个很好的可移植性点……这与您已经给出的事实不同,即标准库函数名保留用于外部链接,因为即使您从未包含相关的头,链接规则也适用。并且除了查询保留id之外,无法通过任何其他方式可靠地进行处理实体和“未来方向”@SteveJessop这是一个有趣的观点,谢谢你的评论。在OP的例子中,fopen
被声明为int
,事实上,fopen
可以被定义为类似于函数的宏,在标题中没有关联。但是一个函数指针类型和指针调用的不同例子确实会有问题。