我最近遇到了一种相当不寻常的编码约定,其中对返回“void”的函数的调用以(void)为前缀。
e.g。
(void) MyFunction();
与函数调用有什么不同:
MyFunction();
它有没有任何优势,或者它是另一种不必要但有某种编码惯例?
答案 0 :(得分:12)
某些函数(如printf())返回的值几乎从未在实际代码中使用(在printf的情况下,打印的字符数)。但是,某些工具,例如 lint ,期望如果函数返回一个必须使用的值,并且除非你写下这样的内容,否则会抱怨:
int n = printf( "hello" );
使用void cast:
(void) printf( "hello" );
是一种告诉这些工具的方法,你真的不想使用返回值,从而使它们保持安静。如果您不使用此类工具,则无需费心,在任何情况下,大多数工具都允许您将它们配置为忽略特定函数的返回值。
答案 1 :(得分:2)
不,没有任何区别 - 什么被转换为void是函数的返回值。
我会说你可能会明白你想要明确表示你没有使用返回值(你为副作用调用它),但是因为函数已经返回void,所以它没有很有意义。
答案 2 :(得分:0)
如果函数返回某些内容,则void可以避免(!)在某些编译器(或lint工具)上发出警告(实际上我无法让gcc警告我返回值丢失);但更重要的是,它清楚地表明返回值是故意“抛弃”的(而不是错误的)。
答案 3 :(得分:0)
acedemically:“函数”总是返回一些东西,否则它将是一个过程。所以这段代码的作者想说“我知道这个命名是错的,但我不会改名字,所以我让这种干扰可见”
答案 4 :(得分:0)
它有没有任何优势,或者它是另一种不必要但有某种编码惯例?
没有区别。这是一个很常见的惯例,例如在软件测试中突出显示在上下文中函数返回(如果有的话)可以安全丢弃的事实。
答案 5 :(得分:0)
在HPUX手册页中,在示例代码中看到一个转换为void来解决lint警告是很常见的。
fprintf(mystream, "%s\n", "foo");
VS
(void)fprintf(mystream, "%s\n", "foo");
这可能是代码作者的来源。 IMO,这不是一个好主意,因为大多数sprintf系列,例如,调用malloc。当内存不足时,malloc将失败。对于printf()系列成员,SIGINT还会导致底层的write()系统调用中断而不是写入所有缓冲区。