【问题标题】:Need for prefixing a function with (void)需要在函数前面加上 (void)
【发布时间】:2011-03-03 10:20:36
【问题描述】:

我最近遇到了一个相当不寻常的编码约定,其中对返回“void”的函数的调用以 (void) 为前缀。

例如

(void) MyFunction();  

它与函数调用有什么不同,例如:

MyFunction();  

它有什么优势,还是另一个不必要的但有某种编码约定?

【问题讨论】:

    标签: c function void coding-style


    【解决方案1】:

    像 printf() 这样的一些函数返回一个在实际代码中几乎从未使用过的值(在 printf 的情况下,是打印的字符数)。然而,一些工具,比如 lint,期望如果一个函数返回一个值,它必须被使用,除非你写这样的东西,否则会报错:

    int n = printf( "hello" );
    

    使用 void 强制转换:

    (void) printf( "hello" );
    

    是一种告诉此类工具您真的不想使用返回值的方法,从而使它们保持安静。如果您不使用此类工具,则无需费心,而且在任何情况下,大多数工具都允许您将它们配置为忽略来自特定函数的返回值。

    【讨论】:

    • 我明白了。但是,为什么有人要为已经返回 void 的函数这样做呢?
    • 当然,但他说演员表是为返回 void 的函数制作的。
    • @puffadder 猜测,函数的返回类型在某些时候发生了变化,但调用代码没有。
    【解决方案2】:

    不,没有任何区别——转换为 void 的是函数的返回值。

    我想说你想明确表示你没有使用返回值(你调用它是为了副作用),但由于函数已经有 void 返回,它没有很有道理。

    【讨论】:

      【解决方案3】:

      如果函数返回某些内容,则 void 可以避免(!)在某些编译器(或 lint 工具)上出现警告(实际上我无法让 gcc 警告我返回值丢失);但更重要的是,它清楚地表明返回值是故意“丢弃”的(而不是错误地)。

      【讨论】:

        【解决方案4】:

        acedemically:“函数”总是返回一些东西,否则它将是一个过程。所以这段代码的作者想说“我知道这个命名是错误的,但我不会更改名称,所以我让这个干扰可见”

        【讨论】:

          【解决方案5】:

          它有什么优势,还是另一个不必要的但有某种编码约定?

          没有区别。这是一个非常常见的约定,例如在软件测试中强调这样一个事实,即在上下文中函数返回(如果有的话)是可以安全丢弃的。

          【讨论】:

            【解决方案6】:

            在 HPUX 手册页中,在示例代码中看到强制转换为 void 以绕过 lint 警告是很常见的。

            fprintf(mystream, "%s\n", "foo");
            

            对比

            (void)fprintf(mystream, "%s\n", "foo");
            

            这可能是代码作者的来源。 IMO,这不是一个好主意,因为大多数 sprintf 系列,例如,调用 malloc。内存不足时 malloc 会失败。对于 printf() 系列成员,SIGINT 还会导致底层 write() 系统调用中断而不是写入所有缓冲区。

            【讨论】:

              猜你喜欢
              • 2018-03-14
              • 2012-02-23
              • 2016-09-24
              • 1970-01-01
              • 1970-01-01
              • 2010-12-14
              • 2022-10-14
              • 2017-08-26
              • 2018-08-04
              相关资源
              最近更新 更多