C main和fopen是有效的变量名吗?

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

C标准规定变量名不应与标准C关键字和标准函数名匹配。那么为什么下面的代码编译时没有错误呢

#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
可以被定义为类似于函数的宏,在标题中没有关联。但是一个函数指针类型和指针调用的不同例子确实会有问题。