从了解Unix编程,第1.6章,more01.c
示例:
int see_more(), reply;
我tried一些类似的代码:
#include <stdio.h>
int main()
{
int hey(), reply;
return 0;
}
int hey()
{
printf("Hello");
};
日志中没有错误,但控制台上没有Hello
。有人可以解释一下吗?
答案 0 :(得分:4)
这将编译得很好。但你所做的只是声明这个功能。这与在顶层添加(非原型)声明相同。
int hey( );
// ^ empty parens means it's not a prototype
如果它是初始化程序的一部分,您可以在声明中调用函数。
#include <stdio.h>
int main()
{
int reply=hey();
// ^ here the function is called, even though this is a declaration,
// because the value is needed.
return 0;
}
int hey(){
return printf("Hello");
// a function returning `int` ought to `return ` an int!
};
但通常调用函数只需将调用放在(非声明)表达式语句中。
#include <stdio.h>
int main()
{
int reply; // declaring a variable
int hey(); // declaring a function
(void) hey(); // function call, casting return value to (void)
return 0;
}
int hey(){
return printf("Hello");
};
在一些早期编译器中存在一个限制,即只有最后一个声明可以包含函数调用。 C99(以及大多数“现代”编译器)放宽了这一限制,现在可以在初始化程序中使用函数调用而不受惩罚。
IIRC splint
语法检查器对初始化程序中的函数调用具有相同的限制。
它可能被认为是坏样式,但是在没有原型的情况下调用函数不一定是不正确的。可以肯定的是,它消除了编译器从类型的角度检查调用是否有意义的能力。但你真正需要做的就是不要搞砸。
非原型函数将默认为标准调用约定,这意味着所有整数args(char,short,int)都提升为int
,所有float args都提升为double
。这些促销也适用于使用#include <stdarg.h>
(和我们心爱的printf
)的可变函数,所以我认为知道如何调用非原型函数非常有用。
我有一些“不要搞砸”的代码here通过函数指针调用非原型函数。这一切都符合标准(尽可能接近我的标准),但我不知道如何对该功能指针进行原型设计,这可能指向许多刻板模式中的一种。使用可变符号(...)
是不正确的,因为它不是一回事。没有合适的方法对其进行原型化,因此指针只是声明为void (*fp)();
。
答案 1 :(得分:1)
你只是声明那里的功能,而不是叫它。
像这样:
int main()
{
extern int hey(); // there is a function "hey" somewhere
hey();
}
答案 2 :(得分:-1)
int hey()
方法不返回任何值。尝试制作void hey()
。