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

时间:2010-06-14 08:44:44

标签: c function void coding-style

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

e.g。

(void) MyFunction();  

与函数调用有什么不同:

MyFunction();  

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

6 个答案:

答案 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()系统调用中断而不是写入所有缓冲区。