【问题标题】:Warning: C4013 in C lang警告:C 语言中的 C4013
【发布时间】:2010-07-22 21:31:35
【问题描述】:
#include <stdio.h>
#include <string.h>


void prints(char *menu)
{
 int p = 0;

 p = navigation(p, menu);

}

int navigation(int p, char *menu)
{

 return p;
}

void main(void)
{
 char *menu[] = {"data", "coming", "here"};

 prints(*menu);

 printf("\n");

}

我该如何解决这个警告是:

警告 1 警告 C4013:“导航” 不明确的;假设外部返回 int i:*\testingzone\index.c 9

【问题讨论】:

  • 在某些语言(python、PHP、JavaScript 等)中,您可以声明调用其他尚未定义的函数的函数,重要的是函数是否在您调用时声明调用它的函数......如果你明白我的意思。 C 不是那样的。

标签: c visual-studio-2010


【解决方案1】:

除了您收到的声明函数的其他建议外,在这种情况下,您只需重新排列函数定义:

#include <stdio.h>
#include <string.h>

int navigation(int p, char *menu)
{
 return p;
}

void prints(char *menu)
{
 int p = 0;

 p = navigation(p, menu);
}

int main(void)
{
 char *menu[] = {"data", "coming", "here"};

 prints(*menu);
 printf("\n");
 return 0;
}

但这并不总是可能的。特别是,当/如果您有相互递归的函数(A 调用 B,B 也调用 A)时,您需要使用声明。

我还修复了从 main 定义错误返回类型的未定义行为。

【讨论】:

    【解决方案2】:

    在调用函数之前声明它们。在您的情况下,您在声明之前尝试调用navigation。它在 C89/90 中是合法的,但通常会导致编译器警告。 C语言的C99规范需要声明,这意味着您的警告将在C99​​中变成错误。所以,如果你只是这样做

    int navigation(); /* declaration */
    

    在尝试调用navigation 之前,警告将消失。

    此外,最好不要在调用函数之前声明它们,而是用 prototype 实际声明它们。 C99 不需要这样做,但它仍然是一个非常好的实践。 IE。最好将navigation 声明为

    int navigation(int, char *); /* prototype */
    

    int navigation(int p, char *menu); /* prototype */
    

    取决于你的口味。

    请注意,您的编译器警告文本具有误导性。似乎表明在调用之前需要函数的定义。实际上,仅仅非定义声明就足够了。

    【讨论】:

      【解决方案3】:

      它的意思是它所说的;您正在尝试使用尚不存在的导航()。您需要将 navigation() 移动为文件中的第一个方法。或者,最好是,您应该在文件开头对所有函数进行原型设计。

      【讨论】:

        【解决方案4】:

        在第一次使用navigation 时在上方某处添加原型int navigation(int p, char *menu);。在定义之前使用函数时会出现该错误。

        【讨论】:

          【解决方案5】:
          #include <stdio.h>
          #include <string.h>
          
          
          int navigation(int p, char *menu);
          void prints(char *menu);
          
          
          
          
          
          void main(void)
          {
              char *menu[] = {"data", "coming", "here"};
          
              prints(*menu);
          
              printf("\n");
          
          }
          
          int navigation(int p, char *menu)
          {
          
          
              return p;
          }
          
          void prints(char *menu)
          {
              int p = 0;
          
              p = navigation(p, menu);
          
          }
          

          即使让它看起来再次显示 p = navigation(p, menu) 上的错误

          【讨论】:

          • 编辑您的问题并在此处添加此信息。当您将其作为答案发布时很难找到。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-08
          • 2017-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-25
          相关资源
          最近更新 更多