假设我有两个除main((之外的函数,分别是func1((和func2((。我可以在func(2(中调用func1((而不首先声明它吗?还是应该使用指向另一个函数的指针并将其作为参数传递?提前谢谢。
_"Is it possible for me to call func1() in func(2) without declaring it first?"_
这取决于编译器,但通常情况下这不会起作用。(参见答案底部的排除示例。(
一些场景说明:
场景1:通常不会工作,因为函数在声明之前被引用:
int main(void)
{
int ret = func1();
return 0;
}
int func1(void)
{
return 1;
}
int func2(void)
{
return func1();
}
结果:
9,15错误:函数"func1"的隐式声明无效在C99中。请确保包含函数原型。
场景2:由于所有必需的定义都按顺序出现,因此编译和运行时不会出现问题:
char func1(void)
{
return 1;
}
char func2(void)
{
return func1();
}
int main(void)
{
char ret = func1();
ret = func2();
return 0;
}
结果:
编译和运行没有问题,因为这两个函数都是在调用之前定义的(从main()
调用func2()
和从func1
调用func1()
(
场景3:最好的方法始终是在调用函数之前在同一文件中使用原型预先声明函数,或者在任何使用原型的源文件中包含的头文件中使用原型。这清除了任何潜在的问题,尤其是对于那些继承代码进行维护的问题:
int func1(void);
int func2(void);
int main(void)
{
int ret = func1();
return 0;
}
int func1(void)
{
return 1;
}
int func2(void)
{
return func1();
}
关于您的评论:
"。。。我书中的一句话引起了混乱,我认为这可能与书中C编译器的版本和我使用的版本不同有关">
可能是:根据下面的注释,一些现代编译器(例如gcc
(支持预标准C函数定义,因此将编译场景1&2,如果函数符合默认函数定义,则没有问题;例如:
int func1(void)
int func2(void)
以下是您的操作方法:
void func2(int code); // forward declaration
void func1(const char* str)
{
func2(str[0]); // a call to a declared function
}
void func2(int code) // the callee
{
printf("code: %dn", code);
}