隐含的功能声明?

时间:2012-06-21 15:25:54

标签: c declaration implicit

我还在学习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'

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

任何帮助表示感谢。

5 个答案:

答案 0 :(得分:2)

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

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

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

 #include "foo.h"

答案 1 :(得分:0)

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

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

#include "myheader.h"

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

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

答案 2 :(得分:0)

您应该能够像在同一文件中的其他函数一样,将函数原型放在文件的顶部。链接器应该处理其余的事情。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

函数声明必不可少的唯一时间是使用协同例程:functionA调用functionB,而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);
}