关于使用VC和gcc或其他的C的不同规则?

时间:2014-04-24 14:21:34

标签: c visual-studio-2010 visual-c++ gcc

代码很简单,如下所示:code1:

#include<stdio.h>
void main()
{
  int a=0;
  printf("c");
  int b=1;
  printf("q");
}

问题是,当我在Visual C ++ 6.0或Visual Studio 2010中编译此代码时,出现“缺少”错误;我知道错误不是“;”。当我编写类似代码2的代码时没有错误:

 #include<stdio.h>
    void main()
    {
      int a=0;
      int b=1;
      printf("c");

      printf("q");
    }

但是当我使用gcc或IDE c-free 5编译code1时,它没有问题。

由于Microsoft在其产品中使用的编译器或我不知道的东西,这是一个问题。我不记得任何书都说变量必须放在C文件中。 这些编译器有不同的标准??

3 个答案:

答案 0 :(得分:2)

Visual Studio until recently did not have any support for C99但目前支持C99的子集,允许在gcc中混合代码和声明,如果您使用-std=c90 -pedantic,您将收到第一个代码示例的警告:

  

警告:ISO C90禁止混合声明和代码[-Wpedantic]

by default gcc使用-std=gnu90,但如果您添加-pedantic标记,则会看到相同的警告。

同样main应该返回 int 而不是 void

答案 1 :(得分:1)

  

在Visual C ++ 6.0或Visual Studio 2010中编译此代码时

Visual Studio不符合C标准,特别是不符合该标准的两个最新版本。所以形式上,Visual Studio不是C编译器。这就是你得到奇怪的编译器错误的原因。

  

但是当我使用gcc或IDE c-free 5编译code1时,它没有问题。

是的,这个代码不会在符合标准的C编译器上编译(对于托管系统)。 GCC正确报告以下错误:

error: return type of 'main' is not 'int' [-Wmain]

答案 2 :(得分:0)

语言gcc目标与C99有些相关; Microsoft编译器所针对的语言与C89有些相关。

它们是不同的语言,并且有不同的规则。

我相信你可以使微软编译器的行为类似于带有选项的C89编译器(/Za如果我没有记错的话);并且您可以使用gcc-std=c89选项使-pedantic-errors表现得像C89编译器;选项-std=c99-pedantic-errors使gcc行为like a C99 compiler