我还在学习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'
我已经尝试将其包含在标题中但是我收到错误,说找不到文件或目录。
任何帮助表示感谢。
答案 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);
}