【问题标题】:Make functions call each other - C使函数相互调用 - C
【发布时间】:2015-01-19 17:16:13
【问题描述】:

一个菜鸟问题:我创建了一个名为 funcoes.h 的库,它有一个 menu() 和其他可以调用 menu() 的函数。一个例子:

void cifrar(){

 printf("\n\nDeseja cifrar outra mensagem? Digite 1 para Sim ou 2 para sair: ");
 scanf("%d", &exit);

 if(exit == 1){
      cifrar();
         }
 else{
      menu();
      }

}

void menu(){
     printf("Escolha uma das opcoes: ");         
     scanf("%d", &varMenu);
     switch(varMenu){
                     case 1:
                          system("cls");
                          cifrar();
                          break;
                     case 2:
                          system("cls");
                          decifrar();
                          break;
                     case 3:
                          system("cls");
                          sair();
                          break;
                     default:
                          system("cls");   
                          printf("Escolha uma opcao valida!\n\n");
                          menu();
                          break;
     }         
}

但是当我编译时,我有这个错误:

In function 'void cifrar()'
'menu' undeclared(first use this function)"

'void menu()' used prior to declaration

如何让它们互相调用而不出现这个错误?

谢谢!

【问题讨论】:

  • library called funcoes.h... 真的是这样吗?我有兴趣。
  • 你是否在.h文件的开头声明了所有这些函数的原型?
  • 你需要先声明函数原型
  • 您需要在定义任何其他函数之前定义void menu()。或者至少向前声明它的函数签名。
  • 您必须在头文件.h 文件中声明函数原型(这就是它的名称,而不是库)

标签: c function dev-c++


【解决方案1】:

您应该做的是创建一个头文件,该文件将包含您所有函数的签名,然后您无需担心每个函数在代码中的位置,您将能够使用所有代码中的所有功能。

您的代码应如下所示:

funcoes.h

void cifrar(void);
void menu(void);

funcoes.c

#include "funcoes.h"

void cifrar(void){

 printf("\n\nDeseja cifrar outra mensagem? Digite 1 para Sim ou 2 para sair: ");
 scanf("%d", &exit);

 if(exit == 1){
      cifrar();
         }
 else{
      menu();
      }
}

void menu(void){
     printf("Escolha uma das opcoes: ");         
     scanf("%d", &varMenu);
     switch(varMenu){
                     case 1:
                          system("cls");
                          cifrar();
                          break;
                     case 2:
                          system("cls");
                          decifrar();
                          break;
                     case 3:
                          system("cls");
                          sair();
                          break;
                     default:
                          system("cls");   
                          printf("Escolha uma opcao valida!\n\n");
                          menu();
                          break;
     }         
}

另一个小技巧,不要创建没有任何参数的函数,例如:

void menu();

始终插入要传递的参数。如果您希望函数不获取参数,只需传递 void。

void menu (void);

【讨论】:

    【解决方案2】:

    好吧,也许总结一下 cmets 中的内容会很好。

    编译器想知道任何函数的原型,然后才能在其他地方使用该函数。这里的“之前”意味着类似于“源文件中的早期”。不过,您可以将所有原型放在单独的 .h 文件中,将其与实际代码一起包含在 .c 文件中,然后按照您喜欢的任何顺序放置函数实现 - 编译器不会抱怨。

    【讨论】:

      【解决方案3】:

      您调用的每个函数都必须在该调用之前声明。你可以通过使用该函数的原型来做到这一点:

      void menu();
      
      void cifrar() {
        ...
      }
      
      void menu() {
      
        ..
      }
      

      或者简单地将整个主要功能(连同它的主体)放在 cifrar 之上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-24
        • 2017-02-15
        • 2013-01-25
        • 1970-01-01
        • 2016-10-18
        相关资源
        最近更新 更多