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

时间:2014-09-17 13:04:48

标签: c keyword

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

#include <stdio.h>

int main()
{
    int main = 10;
    printf("Magic is %d", main);
    return 0;
}

另见http://codepad.org/OXk4lZZE

在下面的answer中,ouah写道

  

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

中为main

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

#include <stdio.h>

int main()
{
    int fopen = 10;
    printf("Magic is %d", fopen);
    return 0;
}

2 个答案:

答案 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