我最近遇到了一个相当不寻常的编码约定,其中对返回“void”的函数的调用以 (void) 为前缀。
例如
(void) MyFunction();
它与函数调用有什么不同,例如:
MyFunction();
它有什么优势,还是另一个不必要的但有某种编码约定?
我最近遇到了一个相当不寻常的编码约定,其中对返回“void”的函数的调用以 (void) 为前缀。
例如
(void) MyFunction();
它与函数调用有什么不同,例如:
MyFunction();
它有什么优势,还是另一个不必要的但有某种编码约定?
像 printf() 这样的一些函数返回一个在实际代码中几乎从未使用过的值(在 printf 的情况下,是打印的字符数)。然而,一些工具,比如lint,期望如果一个函数返回一个必须使用的值,并且会抱怨,除非你写这样的东西:
int n = printf( "hello" );
使用 void 演员表:
(void) printf( "hello" );
是一种告诉此类工具您真的不想使用返回值的方法,从而使它们保持安静。如果您不使用此类工具,则无需费心,并且在任何情况下,大多数工具都允许您将它们配置为忽略来自特定函数的返回值。
不,没有任何区别——被转换为 void 的是函数的返回值。
我想说你想明确表示你没有使用返回值(你调用它是为了产生副作用),但由于函数已经有 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() 系统调用中断而不是写入所有缓冲区。