考虑下面这个程序。它会产生编译错误吗?
#include <stdio.h>
int s=5;
int s;
int main(void)
{
printf("%d",s);
}
乍一看,似乎编译器会给出变量重定义错误,但根据C标准,该程序是完全有效的。(在此处查看实时演示http://ideone.com/Xyo5SY)。试探性定义是指没有存储类说明符和初始化程序的任何外部数据声明。
C99 6.9.2/2
引用:
没有初始化程序且没有存储类说明符或具有静态存储类说明符的文件范围对象的标识符的声明构成试探性定义。如果一个翻译单元包含一个或多个标识符的试探性定义,并且翻译单元不包含该标识符的外部定义,则行为就像翻译单元包含该标识符的文件范围声明一样,它的综合类型与翻译单元结束时相同,初始化程序等于0。
我的问题是,允许试探性定义的理由是什么?C中是否有这种使用方式?为什么C允许试探性定义?
main(c,v)int c; char ** v; {…}
)相同:向后兼容性。 实际向后兼容性。换句话说,您可以通过现代编译器运行自 1973 年以来没有被修改过的 C 代码库,并且它仍然可以编译。 - Braden Best