通过了解Unix编程,第1.6章,more01.c
示例:
int see_more(), reply;
我已尝试一些类似的代码:
#include <stdio.h>
int main()
{
int hey(), reply;
return 0;
}
int hey()
{
printf("Hello");
};
日志中没有错误,但控制台上没有Hello
。有人能解释一下吗?
发布于 2013-09-26 23:45:55
这将编译得很好。但你所做的就是声明这个函数。这与在顶层添加(非原型)声明是一样的。
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
,而所有浮动args将提升到double
。这些提升也适用于使用#include <stdarg.h>
(和我们心爱的printf
)的各种函数,所以我认为知道如何调用非原型函数非常有用。
我有一些“不要搞砸了”的代码这里,它通过函数指针调用非原型函数。这一切都工作,并符合标准(接近我可以想象),但我不知道如何原型的函数指针,这可能指向许多定型模式之一。使用可变符号(...)
是不正确的,因为它不是一回事。只是没有合适的方法来原型它,所以指针被声明为void (*fp)();
。
发布于 2013-09-26 23:45:33
您只是在那里声明函数,而不是调用它。
如下所示:
int main()
{
extern int hey(); // there is a function "hey" somewhere
hey();
}
发布于 2013-09-26 23:45:54
int hey()
方法不返回任何值。试着把它变成void hey()
。
https://stackoverflow.com/questions/19045354
复制