C 在调用有无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语言,可能逻辑不同于

调用方法时,我无法理解使用void的结果。下面是调用
test()
main()
test()
返回值为
void

如果调用
void test()
(使用
void
),执行似乎会停止:没有来自
test()的打印

如果调用
test()
(no
void
),执行工作正常

这是什么逻辑?我在想,调用中的单词
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)
是完全多余的,除了增加视觉噪音外,它什么也不做。