C89,混合变量声明和代码

fie*_*sor 5 c gcc c89 visual-c++

我很好奇,当你尝试混合变量声明和代码时,为什么C89编译器会在你身上转储,例如:

rutski@imac:~$ cat test.c
#include <stdio.h>

int
main(void)
{
    printf("Hello World!\n");
    int x = 7;
    printf("%d!\n", x);
    return 0;
}
rutski@imac:~$ gcc -std=c89 -pedantic test.c
test.c: In function ‘main’:
test.c:7: warning: ISO C90 forbids mixed declarations and code
rutski@imac:~$ 
Run Code Online (Sandbox Code Playgroud)

是的,你可以避免这种事情,远离-pedantic.但是,您的代码不再符合标准.任何能够回答这篇文章的人都可能已经知道,这不仅仅是一个理论上的问题.像Microsoft的C编译器这样的平台在任何和所有情况下都可以在标准中快速执行.

鉴于古老的C是多么的,我想这个功能是由于一些历史问题可以追溯到70年代非凡的硬件限制,但我不知道细节.或者我完全错了吗?

Jon*_*ler 7

C标准说"你不应该",因为在C89标准标准化的早期C编译器中不允许这样做.创建一种可用于编写操作系统及其实用程序的语言是一个足够激进的步骤.可能根本没有考虑这个概念 - 当时没有其他语言允许它(Pascal,Algol,PL/1,Fortran,COBOL),所以C也不需要.并且它可能使编译器稍微难以处理(更大),并且原始编译器受到64 KiB代码的空间限制和PDP 11系列允许的64 KiB数据空间(大机器;更小的机器仅允许64 KiB)对于代码和数据,AFAIK).因此,额外的复杂性并不是一个好主意.

正是C++允许声明和变量交错,但C++不是,而且从来没有,C.但是,C99最终赶上了C++(这是一个有用的功能).可悲的是,微软从未实施过C99.