0

我仍在学习 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,插入和删除都采用以下形式: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'

我已经尝试将它包含在标题中,但我收到错误提示找不到文件或目录。

任何帮助表示赞赏。

4

5 回答 5

2

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

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

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

 #include "foo.h"
于 2012-06-21T15:31:44.510 回答
0

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

于 2012-06-21T15:42:27.427 回答
0

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

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

#include "myheader.h"

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

一般来说,#include "file"is 用于程序员定义的标头,而#include <file>is 或标准标头。

于 2012-06-21T15:28:13.947 回答
0

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

于 2012-06-21T16:05:08.670 回答
0

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

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

唯一需要函数声明的情况是在使用协同例程时: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);
}
于 2016-03-04T14:32:17.650 回答