【问题标题】:peculiar visual studio compile error特殊的视觉工作室编译错误
【发布时间】:2015-04-20 11:11:43
【问题描述】:

有谁知道为什么这个代码变体在 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;
}

第二个变体返回这些错误

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

无论哪种方式使用 mingw gcc 都可以正常工作。

【问题讨论】:

标签: c visual-studio-2010


【解决方案1】:

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

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

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

【讨论】:

  • 它可以在 gcc 中工作,因为它是一个符合标准的 C 编译器,就这么简单。它与 GNU 扩展无关。与 Visual Studio 不同,gcc 能够及时了解过去 25 年来 C 语言发生的一切。
  • 谢谢。有没有什么地方可以查看哪些版本的 Visual Studio 支持哪些标准?
  • @Lundin ,默认情况下,没有 -std 标志的 GCC 在 C89 中编译,对吗?那么,不是因为扩展吗?
  • 默认情况下,GCC 以非标准模式编译。它是一些版本,即“C11 and then some”。编译时比添加 -std-pedantic-errors 标志时要宽松得多(这就是这些标志很棒的原因)。如果编译为例如-std=c90 -pedantic-errors,K&R 代码将无法编译。
猜你喜欢
  • 1970-01-01
  • 2011-11-16
  • 2014-04-09
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多