问题空间
嗨,大家好,
为什么要对原型函数char *zalloc();
进行注释会给出下面的编译错误?
删除原型函数注释后,一切似乎都能正常工作。
示例代码:
#include <stdio.h>
#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf; // allocbuf = &allocbuf[0]
char *fn();
// char *zalloc();
int main()
{
int a = 100;
char *c = fn();
char *d = zalloc(1000000);
printf("%s\n", c);
printf("%p\n", d);
}
char *zalloc(int n)
{
if (allocbuf + ALLOCSIZE - allocp >= n) {
allocp += n;
return allocp - n;
} else
return 0;
}
void afree(char *p)
{
if (p >= allocbuf && p < allocbuf + ALLOCSIZE)
allocp = p;
}
char *fn()
{
return "foo";
}
编译错误:
example_24.c: In function 'main':
example_24.c:16:12: warning: initialization makes pointer from integer without a cast
char *d = zalloc(1000000);
^
example_24.c: At top level:
example_24.c:22:7: error: conflicting types for 'zalloc'
char *zalloc(int n)
^
example_24.c:16:12: note: previous implicit declaration of 'zalloc' was here
char *d = zalloc(1000000);
答案 0 :(得分:2)
如果C编译器检测到它不知道的函数,则假定它返回int
。
由于zalloc()
用于初始化char*
,您会收到相关邮件:... makes pointer from integer ...
答案 1 :(得分:2)
char *d = zalloc(1000000);
在这一行中,您将调用编译器以前从未见过的函数。当发生这种情况时,编译器会假定函数返回int
,就像之前已经完成int zalloc(int);
一样。
这就是为什么你得到一个关于用一个整数和一个&#34;冲突类型初始化指针(char *d
)的警告&#34;稍后当编译器看到实际函数定义时出错。
答案 2 :(得分:1)
在C语言中,您需要在调用它们之前声明您的函数(不需要原型,但至少是非原型声明)。这意味着当您注释掉函数声明时,您的程序将变为无效。
您的编译器的诊断消息具有误导性,因为它们似乎掩盖了主要问题。我猜你的编译器配置不正确,无法遵守现代C规范的要求。
P.S。请注意,BTW,您的两个原始函数声明都是非原型的。您需要显式(void)
作为函数参数列表来为无参数函数创建原型声明(参考fn
)。
答案 3 :(得分:0)
它不会编译,因为编译器会自动假定一个不是'function-prototyped'的函数将返回一个int。
另外,func原型被认为是一种很好的做法。