【问题标题】:error C2143: syntax error : missing ';' before 'type'错误 C2143:语法错误:缺少“;”在“类型”之前
【发布时间】:2013-03-29 04:10:17
【问题描述】:

我是 C 编程新手。请告诉我这个程序有什么问题,以及为什么我会收到此错误:error C2143: syntax error : missing ';'在“类型”之前....

extern void func();

int main(int argc, char ** argv){
    func();
    int i=1;
    for(;i<=5; i++) {
        register int number = 7;
        printf("number is %d\n", number++);
    }
    getch();
}

【问题讨论】:

  • 我至少有8年没用过visual了,但是Visual有限的C编译器支持允许混合代码和变量吗?是 int i=1 的声明中的错误行; ??尝试将它移到对 func() 的调用之上;另外,我会使用 extern void func(void);
  • 您没有显示完整的代码。有问题的片段很好,不应该产生任何语法错误。
  • @RandyHoward:我认为这就是问题所在:Visual C 不允许混合声明和语句,这是 1999 年 ISO 标准添加到 C 中的一项功能,Visual Studio 不支持该功能。您应该将其发布为答案。
  • @RandyHoward:不从main() 返回值并不违法。在 C89/C90 中,它向环境返回未定义的状态。在 C99 中,它相当于 return 0;。
  • 在for 循环中对i 进行初始分配会更清楚:int i; for (i = 1; i &lt;= 5; i ++) ...。 (如果 MS 支持 C99,你也可以在那里声明它。)

标签: c visual-studio-2010


【解决方案1】:

Visual Studio 仅支持 C89。这意味着您的所有变量都必须在函数顶部的任何其他内容之前声明。

编辑:@KeithThompson 促使我添加一个技术上更准确的描述(并且真的只是正确的,我的不是在一个方面)。所有(变量或其他任何东西的)声明必须在块内的所有语句之前。

【讨论】:

  • 实际上这意味着所有声明(变量或其他任何东西)必须在块内的所有语句之前。
  • @KeithThompson:绝对是技术上更正确的回应。
【解决方案2】:

我至少有 8 年没有使用 Visual,但似乎 Visual 有限的 C 编译器支持不允许混合代码和变量。 int i=1; 的声明中的错误行是??尝试将其移至func(); 的调用上方

另外,我会使用extern void func(void);

【讨论】:

    【解决方案3】:

    这个:

    int i=1;
    for(;i<=5; i++) {
    

    应该习惯性地写成:

    for(int i=1; i<=5; i++) {
    

    因为没有必要在函数范围内声明for循环变量。

    【讨论】:

    • @EdS。这样变量在for 块中声明,这应该可以解决他的问题。
    • 该语法仅在 C++ 和 C99 中有效,在 C89 中无效。 Visual Studio 仅支持 C 的 C89 方言。
    • @AdamRosenfield 我在 VS2003 中使用过这种语法,从那时起应该不会有太大变化。
    • @AdamRosenfield:即使 VS 确实支持 C99,也无法回答 OP 的问题。这部分代码可以改进,但在所有 C 版本中都是完全合法的。
    • @lenik:Visual Studio 同时支持 C 和 C++(而且似乎更喜欢 C++)。 C++ 支持非常好,这意味着您可以在for 循环头中声明变量,并在C++ 中 混合声明和语句。如果您将代码编译为 C(通过使用 .c 扩展名命名文件),它仅支持 1989/1990 C 标准(我认为只有很少的扩展名,例如 // cmets)——这意味着您甚至不能使用 C99 和 C++ 中都存在的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多