需要在函数前加上(void)的原因

5

最近我遇到了一种非常不寻常的编码约定,即调用返回“void”的函数时,前缀为(void)。

例如:

(void) MyFunction();  

这与函数调用有何不同?
MyFunction();  

它有什么优势吗?还是说它只是另一种不必要的编码约定?
6个回答

12

一些函数,如printf(),返回一个几乎在实际代码中从未使用的值(在printf的情况下,是打印的字符数)。然而,一些工具,如lint,期望如果函数返回一个值,它必须被使用,并且除非你编写类似以下内容的代码,否则会发出警告:

int n = printf( "hello" );

使用void转换:
(void) printf( "hello" );

在编程中,使用“废弃(deprecated)”一词是告诉工具你真的不想使用返回值,从而让它们保持安静。如果你不使用这样的工具,你就不需要去理会,而且无论如何大多数工具都允许你配置它们忽略特定函数的返回值。


我明白了。但是,为什么有人想要对已经返回void的函数这样做呢? - puffadder
当然可以,但他说这个转换是为返回void的函数而设计的。 - Artefacto
4
我猜测这个函数的返回类型在某个时候被更改了,但是调用该函数的代码没有相应更改。 - anon

2
没有区别,被转换为void的是函数的返回值。如果你想明确表示你不使用返回值(你调用它是为了副作用),那么这样做可能有意义,但由于该函数已经具有void返回,所以没有太多意义。

0
如果函数有返回值,void 可以避免警告(事实上,在某些编译器或 Lint 工具中,我无论如何都无法使 gcc 警告我丢失了返回值),但更重要的是,它清楚地表明返回值是“有意”被“抛弃”的(而不是错误)。

0
从学术角度来看,“函数”总是会返回一些东西,否则它就是一个过程。因此,这段代码的作者想表达的意思是:“我知道这个命名是错误的,但我不会改变它,所以我让这个问题显而易见。”

0
它有什么优势吗?还是又是一种毫无必要的编码规范?没有区别。这是一个非常普遍的约定,例如在软件测试中强调,在上下文中,如果有任何函数返回,则可以安全地丢弃它。

0
在HPUX的man页面中,示例代码中经常会看到将变量转换为void类型以避免lint警告的情况。
fprintf(mystream, "%s\n", "foo");

对比。

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

这可能是代码作者的出发点。在我看来,这不是一个好主意,因为大多数 sprintf 系列函数都会调用 malloc,当内存不足时,malloc 会失败。SIGINT 也会导致底层的 write() 系统调用被中断,并且不能完全写入缓冲区,对于 printf() 系列函数而言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接