我正在尝试学习如何将C代码分成多个文件,但这样做时我遇到了错误。
相关代码(以文件分隔):
ex6.h:
#ifndef __ex6_h__
#define __ex6_h__
struct nlist { /* table entry: */
struct nlist *next; /* next entry in chain */
char *name; /* defined name */
char *defn; /* replacement text */
};
#endif
list.c:
#include "ex6.h"
struct nlist *install(char *name, char *defn)
{
struct nlist *np;
unsigned hashval;
if ((np = lookup(name)) == NULL) { /* not found */
np = (struct nlist *) malloc(sizeof(*np));
if (np == NULL || (np->name = strdup(name) == NULL)
return NULL;
hashval = hash(name);
np->next = hashtab[hashval];
hashtab[hashval] = np;
} else /* already there */
free((void *) np->defn); /*free previous defn */
if ((np->defn = strdup(defn)) == NULL)
return NULL;
return np;
}
main.c中:
#include "ex6.h"
int main (int argc, char* argv[])
{
struct nlist *np1;
np1 = install("This", "That");
return 0;
}
当我编译这段代码时,我得到了这个:
cc -g main.c list.c -o main
main.c: In function ‘main’:
main.c:10:6: warning: assignment makes pointer from integer without a cast [enabled by default]
np1 = install("This", "That");
^
显然有更多的代码(如果请求将发布),但代码的其他部分似乎工作正常,除了这个片段。此外,当我将“main.c”文件和“list.c”中的代码放入同一个文件时,代码工作正常。
感谢任何帮助!
答案 0 :(得分:2)
您在头文件中缺少安装功能的声明。这使得编译器假定它返回int
而不是指针,这会导致此警告。添加到ex6.h:
struct nlist *install(char *name, char *defn);
答案 1 :(得分:0)
带main的编译单元没有看到函数install
的声明。因此,编译器假定默认情况下函数的返回类型为int
,并且在此语句中为
np1 = install("This", "That");
。
将类型int
的值分配给指向结构的指针。
你应该在标题" ex6.h"中包含函数声明。因为该函数用于多个编译单元。
答案 2 :(得分:0)
您需要在install
中为ex6.h
添加声明。类似的东西:
extern struct nlist *install(char *name, char *defn);
如果没有声明,函数的假定返回值为int
。编译器会抱怨,因为np1
的类型为struct nlist*
,并且它会尝试将int
分配给np1
。
当您提供声明时,它知道install
的返回类型为struct nlist*
。因此,可以将install
的返回值分配给np1
。