【问题标题】:Why Do I Get "nested functions are disabled..." Error in my Code?为什么我的代码中出现“嵌套函数被禁用...”错误?
【发布时间】:2009-12-27 12:08:31
【问题描述】:

基本上,一个程序可以找到一个数的最大素数。不知道逻辑是否正确,因为我无法运行它来测试它。我知道这很长。但请原谅我。

//largest_prime.c
#include <stdio.h>
int main() {
    int num,large;
    int prime(int);
    int lprime(int);
    printf("Enter number: "); 
    scanf("%d",&num);
    large = lprime(num);
    printf("Largest Prime = %d\n",large);
    return 0;
}

int lprime(int num) {
    int i=num-1,large;
    while (i!=-1) {
        if (num%i==0) {
            if (prime(i)==1) {
                large=i;
                i=-1;
            }
            i--;
        }
        return large;
    }

    int prime(int num) {
        int prime,i=num-1;
        while (i!=-1) {
            if(num%i==0) {
                if(i!=1) {
                    i=-1;
                    return 0;
                }
                else
                    return 1;
            }
            i--;
        }
    }

我使用 GCC 在终端(我使用 Mac)将其作为输出:

largest_prime.c: In function ‘lprime’:
largest_prime.c:26: error: nested functions are disabled, use -fnested-functions to re-enable
largest_prime.c:39: error: syntax error at end of input

我尝试了 -fnested-functions 来重新启用。我明白了:

largest_prime.c: In function ‘lprime’:
largest_prime.c:39: error: syntax error at end of input

请帮忙!

【问题讨论】:

  • 请注意,这就是为什么我讨厌 Java 风格的大括号(前一行末尾的左大括号),你一眼看不出你正在关闭哪个大括号缩进级别。
  • @Blindy:这就是我们有 IDE 的原因,但点得很好。
  • @r0ach:为什么在main 中声明primelprime?为什么不在main 之前声明它们,就像标准的 C 风格一样?
  • 在前一行的末尾有左大括号比 Java 还要老,我可能会补充。

标签: c function


【解决方案1】:

lprime 缺少尾随 '}'(事实上我相信你在尾随 '}' 时丢失了)

【讨论】:

    【解决方案2】:

    return large; 后面缺少一个 }

    编译器推断您正在lprime 内开始一个新的函数声明,因此 嵌套函数错误

    【讨论】:

      【解决方案3】:

      函数不能嵌套在 ISO C 中;启用某些编译器扩展以允许然后不是解决方案;只是让你的代码有效 C。你的缩进风格在这里对你没有帮助;但是每个函数的最后一行不在左边距这一事实应该敲响警钟。以下编译但并非没有警告(已标记的添加行):

      //largest_prime.c
      #include <stdio.h>
      
      // Forward declarations
      int lprime(int num) ;  //********************
      int prime(int num) ;   //********************
      
      int main() {
          int num,large;
          printf("Enter number: "); 
          scanf("%d",&num);
          large = lprime(num);
          printf("Largest Prime = %d\n",large);
          return 0;
      }
      
      int lprime(int num) {
          int i=num-1,large;
          while (i!=-1) {
              if (num%i==0) {
                  if (prime(i)==1) {
                      large=i;
                      i=-1;
                  }
                  i--;
              }              //********************
          }
          return large;
      }
      
      int prime(int num) {
          int prime,i=num-1;
          while (i!=-1) {
              if(num%i==0) {
                  if(i!=1) {
                      i=-1;
                      return 0;
                  }
                  else
                      return 1;
              }
              i--;
          }
      }
      

      警告是:

      main.cpp(34) : warning C4101: 'prime' : unreferenced local variable
      main.cpp(46) : warning C4715: 'prime' : not all control paths return a value
      

      我没有执行过代码,能否正常运行由你自己判断。

      【讨论】:

      • 感谢编辑;我没有注意到“非常规”位置的那些声明。我添加了之前的声明,因为我认为它们完全丢失了。教训是;不要编写“不寻常”的代码。这在很多方面都很不寻常!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多