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

Jee*_*tel 12 c keyword

C标准表示变量名称不应与标准C关键字和标准函数名称匹配.那么为什么下面的代码编译没有错误?

#include <stdio.h>

int main()
{
    int main = 10;
    printf("Magic is %d", main);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另见http://codepad.org/OXk4lZZE

在下面的答案中,ouah写道

main不是保留标识符,允许main在C中命名变量

所以考虑下面的程序,这是否意味着fopen同样没有保留?

#include <stdio.h>

int main()
{
    int fopen = 10;
    printf("Magic is %d", fopen);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

oua*_*uah 32

您的程序是一个有效的C程序.

main不是保留标识符,允许main在C中命名变量.

你不能做的是main在文件范围命名变量,但这与其他与同名函数冲突的变量相同:

这是无效的:

int main = 0;

int main(void)
{
}
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,这是无效的:

int foo = 0;

int foo(void)
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:为解决OP问题编辑,OP问题中的第二个程序也有效,如C所示

(C11,7.1.3p1)"以下任何子条款中包含外部链接的所有标识符(包括未来的库方向)和errno始终保留用作具有外部链接的标识符."

但是fopen变量标识符在示例程序中具有块范围和无链接.