特殊的 visual studio 编译错误

peculiar visual studio compile error

有谁知道为什么这个代码变体在 Visual Studio 2010

下编译和运行
#include <stdio.h>

char *myfunc(char *c, int i) {
    c[0] = (char)i;
    c[1] = 0;
    return c;
}

int main(void) {

    char str[5]; //////////////////////////////

    char *(*fun)(char *, int);
    fun = myfunc;



    puts(fun(str, 51));

    getchar();
    return 0;
}

但是这个没有

#include <stdio.h>

char *myfunc(char *c, int i) {
    c[0] = (char)i;
    c[1] = 0;
    return c;
}

int main(void) {



    char *(*fun)(char *, int);
    fun = myfunc;

    char str[5]; //////////////////////////////

    puts(fun(str, 51));

    getchar();
    return 0;
}

第二种变体returns这些错误

错误 C2143:语法错误:缺少“;”在 'type'
之前 错误 C2065:'str':未声明的标识符

无论哪种方式与 mingw gcc 一起工作都很好。

Visual Studio 2010 支持旧版本的 C,即 C89 或 ANSI C。

在 C89 中,必须在块的开头声明变量。与较新版本的 C 不同,它不支持混合声明。因此,您被迫在 {.

之后声明变量

GCC 支持混合声明 an extension 这解释了为什么代码在 GCC 中编译没有任何问题。