【问题标题】:Confused on calling method with without void对没有 void 的调用方法感到困惑
【发布时间】:2014-01-16 04:38:25
【问题描述】:

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

如果我打电话给void test()(使用void),执行似乎会停止:test() 没有打印

如果我打电话给test()(没有void),执行就可以了。

这是什么逻辑?我在想电话中的void 这个词不知何故在等待来自test() 的返回,而这永远不会出现?但这不是在test() 完成打印工作之后吗?在通话中发送voidtest() 没有处理吗?

注意:这是来自 Propeller 微控制器的 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 testerForVoid();
  • 您发布的代码无效,并且由于void 问题以外的多种原因无法编译。工作、可编译的代码是一项要求。
  • 对不起,凯莉,我同意这个要求。它是我 IDE 中整个程序的复制/粘贴。它可能看起来很奇怪,因为它是用于微控制器的。也许问题是 .h 没有提供?
  • @CareyGregory - 我刚刚编译了它,我包含了可能在 simpletools.h 中的 ,并将 print 更改为 printf,再次可能在包含文件中,这是一个很好的代码 sn- p
  • 是的,缺少 simpletools.h 文件,我们会得到一些无法编译的东西。

标签: c methods call void


【解决方案1】:

void 仅在函数声明中使用。调用返回类型为void的函数时,不使用void直接调用即可。

  • 使用void testerForVoid(); 来声明一个返回void 的函数,就像在您的案例中声明的前向一样。

  • 使用testerForVoid();调用函数。

在你的例子中,对于选项#2,它倾向于再次声明已经被前向声明的函数。没有真正的功能全部执行。

【讨论】:

  • 这应该说明void testerForVoid();是一个前向声明。
  • 谢谢大侠。这样可行。我试图在脑海中建模失败的逻辑是什么?你猜猜这个(错误的)void 是如何被执行的?
  • @EdS。更新。谢谢。
  • "会导致错误" -- 没有错误,只是缺少预期的函数调用
  • 在所以我们表示感谢支持,+1 你打字比我快:)
【解决方案2】:

void testerForVoid(); 声明了一个返回 void 的函数(什么都不做)

testerForVoid();调用函数

【讨论】:

  • 它可能会做一些事情(副作用),但它什么也没返回。
  • @keshlam - 有什么副作用?它已经宣布过一次了吗?而且它不能返回任何东西,这是一个声明。
  • 在编程术语中,对函数返回值以外的事物的影响称为“副作用”。在这种情况下, testerForVoid() 的副作用是它会打印出一条消息。更改字段或对象的状态也会产生副作用。
  • 但是void testerForVoid(); 不是函数调用,在编程术语中它是一个“noop”。第二种情况是函数调用,如您所描述的具有“副作用”
  • ... 对。对不起;我在考虑函数定义而不是前向声明。 (最近在 Java 中工作的时间太多,不需要前向声明。)
【解决方案3】:

选项 1 是对已声明的函数 testerForVoid() 的调用。

选项 2 是函数 testerForVoid() 的声明。这失败了,因为它已经被声明了。

【讨论】:

    【解决方案4】:

    其实这只是声明:

    void testerForVoid(); 
    

    这是真正的电话。

    testerForVoid(); 
    

    【讨论】:

    • 如果我理解正确,问题在于违规行实际上是在执行第二个前向声明而不是调用。我测试了 5 次重复相同前向声明的代码,没有问题,所以似乎允许多个前向声明。我猜它会在编译时抛出错误。
    • 非常感谢。我想如果我学会理解错误,我将学会理解正确的东西。
    • @PlayingwithGAS yes..第二行是前向声明..这当然是不必要的。
    【解决方案5】:

    你可以这样调用函数,

    void Fun()
    {
        printf("Fun");
    }
    int main(int argc, char* argv[])
    {
        (void) Fun();//like this
        return 0;
    }
    

    只是为了显示你的函数返回 void。

    【讨论】:

    • 嗯,为什么? (void) 完全是多余的,除了添加视觉噪音之外什么都不做。
    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2013-07-27
    • 2014-06-06
    • 2017-03-20
    • 2013-07-19
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多