C 在调用有无void的方法时感到困惑
调用方法时,我无法理解使用void的结果。下面是调用C 在调用有无void的方法时感到困惑,c,methods,call,void,C,Methods,Call,Void,调用方法时,我无法理解使用void的结果。下面是调用test()的main()。test()返回值为void 如果调用void test()(使用void),执行似乎会停止:没有来自test()的打印 如果调用test()(novoid),执行工作正常 这是什么逻辑?我在想,调用中的单词void不知何故在等待test()的返回,而它从未出现过?但这不是在test()完成了它的打印工作之后吗?在调用中,它是否正在发送void而test()未处理它 注:这是一个螺旋桨微控制器的C语言,可能逻辑不同于
test()
的main()
。test()
返回值为void
如果调用void test()
(使用void
),执行似乎会停止:没有来自test()的打印
如果调用test()
(novoid
),执行工作正常
这是什么逻辑?我在想,调用中的单词void
不知何故在等待test()
的返回,而它从未出现过?但这不是在test()
完成了它的打印工作之后吗?在调用中,它是否正在发送void
而test()
未处理它
注:这是一个螺旋桨微控制器的C语言,可能逻辑不同于PC上的C语言。非常感谢
#include "simpletools.h";
void testerForVoid(); //forward declare
int main(void)
{
print("Begin main");
// option 1 - no void - works
testerForVoid();
// option 2 - with void - fails
void testerForVoid();
return 0;
}
void testerForVoid()
{
print("\nBegin testForVoid");
}
void
仅在函数声明中使用。当您使用void
返回类型调用函数时,只需调用它而不使用void
- 使用
void testerForVoid()
来声明一个函数,该函数返回void
,与您案例中声明的forward一样
- 使用
testerForVoid()
调用函数
在您的示例中,对于选项#2,它倾向于再次声明已被正向声明的函数。没有真正的函数全部执行。void testerForVoid()代码>声明一个返回void的函数(不执行任何操作)
testerForVoid()代码>调用函数选项1是对已声明的函数testerForVoid()
的调用
选项2是函数testerForVoid()
的声明。此操作失败,因为它已被声明。实际上这只是声明:
void testerForVoid();
这是真正的电话
testerForVoid();
您可以这样调用函数
void Fun()
{
printf("Fun");
}
int main(int argc, char* argv[])
{
(void) Fun();//like this
return 0;
}
只是为了显示函数返回void。void testerForVoid()代码>您发布的代码无效,除了void
问题之外,还有其他原因无法编译。工作,可编译的代码是一个要求。对不起,凯莉,我同意这个要求。它是从我的IDE复制/粘贴整个程序。它可能看起来很奇怪,因为它是为微控制器设计的。可能问题是没有提供.h?@CareyGregory-我刚刚编译了它,我把它包括在simpletools.h中,并将print改为printf,同样可能在include文件中,这是一个很好的代码段是的,缺少simpletools.h文件,我们就剩下一些无法编译的东西。这应该可以解释void testerForVoid();代码>是一个转发声明。谢谢英雄。这很有效。我试图在我的头脑中建立一个模型,为什么它失败的逻辑是什么?有人猜测这个(错误的)空白是如何被执行的吗?@EdS.Updated。谢谢。“这将导致错误”--没有错误,只是缺少预期的函数调用,所以我们用UPVOLUES表示感谢,+1感谢您输入的速度比我快:)它可能会做一些事情(副作用),但不会返回任何结果。@keshlam-什么副作用?已经申报过一次了?它不能返回任何东西,它是一个声明。在编程术语中,对函数返回值以外的事物的影响称为“副作用”。在这种情况下,testerForVoid()的副作用是打印一条消息。更改字段或对象的状态也会产生副作用
不是函数调用,用编程术语来说,它是一个“noop”。第二种情况是函数调用,正如您所描述的,它具有“副作用”。。。正确的。很抱歉我考虑的是函数定义,而不是转发声明。(最近在Java中工作的时间太长了,不需要前向声明。)如果我理解正确,问题是,有问题的行实际上是在执行第二个前向声明,而不是调用。我用5次相同的转发声明重复测试了代码,没有问题,所以似乎允许多个转发声明。我猜它会在编译时抛出一个错误。非常感谢。我想如果我学会理解错误,我就会学会理解什么是正确的。@PlayingwithGAS是的。。第二行是远期申报。。这当然是不必要的。嗯,为什么?(void)
是完全多余的,除了增加视觉噪音外,它什么也不做。