需要为函数添加前缀(void)

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

例如

(void) MyFunction(); 

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

 MyFunction(); 

它有没有任何优势,或者它是另一个不必要但有某种编码约定?

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

 int n = printf( "hello" ); 

使用void cast:

 (void) printf( "hello" ); 

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

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

我会说你可能会明白你想要明确表示你没有使用返回值(你为副作用调用它),但由于函数已经有无效返回,所以它没有多大意义。

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

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

它有没有任何优势,或者它是另一个不必要但有某种编码约定?

没有不同。 这是一个非常常见的惯例,例如在软件测试中突出显示在上下文中函数返回(如果有的话)可以安全丢弃的事实。

在HPUX手册页中,在示例代码中很常见的是将转换为void来解决lint警告。

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

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

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