【问题标题】:error C2143: syntax error: missing ';' before '{' in C错误 C2143:语法错误:缺少“;”在 C 中的“{”之前
【发布时间】:2019-07-07 10:34:48
【问题描述】:

当我尝试使用嵌套函数编译以下 C 代码时:

 #include <stdio.h>
int main() {
    
    int five() {
        return 5;
}

for (int i = 0; i < 10; i++) {
    printf("%d ", five());
    }

    return 0;
}

我收到以下错误: error C2143: syntax error: missing ';' before '{' in C

我正在使用 Visual Studio Community 2017 及其开发者命令行,所以我的编译器是 cl

当我用gcc编译程序时,没有报错,所以我怀疑它与编译器有关,但是如何呢?

【问题讨论】:

  • 嵌套函数不是标准的——只是说。
  • ...含义:将函数five()移出main()——放在main之前,或者声明在main之前,放在之后。
  • 很明显我的编译器出了点问题这在 99.999% 的情况下都是错误的。
  • @mand - GCC 有几个可用的扩展,包括识别嵌套函数,这会让刚开始学习 C 的人感到困惑。我建议在使用 GCC 进行学习或创建可移植代码时,那些导致其以非标准方式运行的扩展被禁止。
  • 如果您正在学习编程,请始终使用gcc -std=c11 -pedantic-errors -Wall -Wextra 编译 gcc。然后你会得到很多警告(好)和纯标准 C,没有扩展。

标签: c visual-studio compiler-errors


【解决方案1】:

编译器按“token”工作。在int main() { 之后,它会看到标记intfive(),它们是函数5 声明的一部分(返回int 并接受未指定但固定数量的参数)。此声明使用标记 ; 完成,但下一个可用标记是 {,这使得整个事情的语法无效。

TLDR:嵌套函数在 C 中是非法的。

【讨论】:

  • 顺便说一句:虽然在其他函数内部是合法的,但函数声明/原型通常在其他函数之外提供。
  • 不...如果您想提供原型并使其成为函数体的本地对象。恐怕你必须在本地使用它。这是自 K&R 第 1 版以来的有效语法。并继续有效。本地范围是你的朋友,不要过度回避它。
  • 你还没有理解我...确保你只在那里使用它,如果你在同一个编译单元的其他地方使用它会收到警告)然后你需要将原型声明的范围缩小到单个函数体(甚至更窄)我已经看到了很多遗留的措辞代码。
  • 你是对的@LuisColorado。另一个函数内的函数声明/原型将范围限制为函数本身。它是合法的,但很少使用。
【解决方案2】:

这是你想要达到的目标吗?

#include <stdio.h>
int five() {
        return 5;
    }
int main() {
    for (int i = 0; i < 10; i++) {
    printf("%d ", five());
    }
    return 0;

}

【讨论】:

  • 您的帖子显然包含语法正确的程序形式。你认为没有解释,提问者就明白为什么你的是正确的,而他们的不是? (解释你的正确原因的句子会增加你的答案的价值。)
【解决方案3】:

格式正确,为了清晰起见,添加了一些开头的 cmets。

#include <stdio.h>

int five()   /* Start of Function FIVE */
{
    return 5;
}            /* End of Function FIVE */



int main()   /* Start of MAIN */
{
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", five());
    }

    return 0;
}             /* End of MAIN */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2013-08-20
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多