【问题标题】:implicit declaration of functions?函数的隐式声明?
【发布时间】:2012-06-21 15:25:54
【问题描述】:

我仍在学习 C 语言,并且我知道要摆脱大多数隐式声明警告,您可以在开头添加原型标题。但是当您在代码中使用外部方法时,我对您会做什么感到困惑。

这是我使用外部方法时的代码

    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
      int arrayCapacity = 10;
      int maxCmdLength = 20;

      int A[arrayCapacity];
      int count = 0; /* how many ints stored in array A */
      char command[maxCmdLength + 1]; 
      int n;

      while (scanf("%s", command) != EOF)
      {

         if (strcmp(command, "insert") == 0)
         {  
             scanf("%d", &n);                   
             insert (n, A, arrayCapacity, &count);
             printArray(A, arrayCapacity, count);
         }
         else if (strcmp(command, "delete") == 0)
         {

             scanf("%d", &n);
             delete(n,A,&count);
             printArray(A, arrayCapacity, count);

        }       
        else
        {
             scanf("%d", &n);
             printArray(A, arrayCapacity, count);
        }
     }
     return 0;
    }   

printArray、insert、delete方法的形式都是:printArray.o, insert.o, delete.o

这就是我编译程序的方式:gcc -Wall insert.o delete.o printArray.o q1.c 我收到这些警告:

q1.c: In function âmainâ:
q1.c:20: warning: implicit declaration of function `insert'
q1.c:21: warning: implicit declaration of function `printArray'
q1.c:30: warning: implicit declaration of function `delete'

我尝试在标题中包含此内容,但我收到错误消息,提示找不到文件或目录。

任何帮助表示赞赏。

【问题讨论】:

  • 您使用的#include 是什么?您将标题放在哪里?

标签: c declaration implicit


【解决方案1】:

将它们放在头文件foo.h 中,如下所示:

 extern void printArray(int *A, int capacity, int count);
 ...

然后将该文件包含在您的源代码中

 #include "foo.h"

【讨论】:

    【解决方案2】:

    您需要包含正确的标题才能消除此类警告。

    如果您收到“找不到文件”错误,请尝试将它们包含为

    #include "myheader.h"
    

    并将您的头文件放在与源代码相同的目录中。

    一般来说,#include "file" 用于程序员定义的标头,而#include &lt;file&gt; 用于标准标头。

    【讨论】:

      【解决方案3】:

      您应该能够将函数原型放在文件顶部,就像对同一文件中的其他函数所做的那样。链接器应该负责其余的工作。

      【讨论】:

        【解决方案4】:

        您从哪里获得这些 .o 文件?如果您自己编写了它们,那么您应该创建相应的.h 文件。如果您从其他地方获得这些文件,那么您应该在同一个地方搜索标题。

        【讨论】:

          【解决方案5】:

          如果所有被调用的函数都写在 ma​​in() 函数之前,编译器将知道它们的名称、返回类型和参数签名,并且可以将所有这三个属性与每个后续函数调用进行匹配。 p>

          有些程序员喜欢先写一个函数签名,然后再实现。

          只有在使用协程时才需要函数声明:functionA 调用 functionB,而后者又调用 functionA。

          按如下方式完成:

          type a(...signatureOfA...)
          
          /* compiler now knows about a() */
          
          type b(...signatureOfB...)
          {…
          // implementation of b
          a(…arguments for a…);
          
          /* compiler knows about above */
           …}
          
          type a(...signatureOfA...)i
          {…
          // implementation of a
          b(…arguments for b…);
          
          /* compiler knows about above */
           …}
          
          int main()
          {
          a(… arguments for a…);
          /* compiler knows */
          return(code);
          }
          

          【讨论】:

            猜你喜欢
            • 2021-01-20
            • 2014-06-28
            • 2022-01-16
            • 2011-10-05
            • 2013-10-28
            • 2019-07-16
            • 2017-07-16
            • 2012-04-20
            相关资源
            最近更新 更多