告诉gcc在C99之前的模式下无法编译

Sha*_*esh 2 c gcc

我正在讲述C的历史,并希望展示一些过去不可能的习语,但现在(特别是在块的中间定义变量).我想表明较旧的C编译器不会编译它.

gcc可以-std=选择设置语言标准.不幸的是,设置它-std=c89不会在块中间定义变量时产生编译错误.

我希望有一个更准确的标准版本(即 - -std=knr),但我找不到任何这样的选项.

我错过了什么吗?这是GCC中的错误吗?

gcc (Ubuntu 8.2.0-7ubuntu1) 8.2.0
Run Code Online (Sandbox Code Playgroud)

错误编译的代码:

#include <stdio.h>

int main(argc, argv)
int argc;
char *argv[];
{
        printf("Hello, world\n");

        int a;

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

如果你想要一个真正严格的-std标志符合,它应该伴随着-pedantic-errors旗帜.

作为演示,带有这些标志的wandbox上的代码会产生:

prog.c: In function 'main':
prog.c:9:9: error: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
         int a;
         ^~~
Run Code Online (Sandbox Code Playgroud)