是否将函数 return 转换为无效 "old-style-cast"?
Is casting a function return to void an "old-style-cast" or not?
Coverity 抱怨我们代码库中的各种函数调用没有检查 return 值。
Unchecked return value (CHECKED_RETURN)3. check_return: Calling Append
without checking return value (as is done elsewhere 73 out of 78
times).
在过去,我们会通过将 return 转换为 void
(因为讨论 here):
(void)Foo.Append(bar);
但是,我们正朝着启用所有警告的方向努力,并且将警告视为错误,所以我有点担心上面的代码会生成一个 old-style-cast
诊断。如果是这样的话,我将需要将我们的代码修改为更丑陋的格式:
static_cast<void>( Foo.Append(bar) );
然而,gcc 和 clang 似乎都能够编译此代码(first 形式)没有抱怨。所以我想我的问题的最终形式是这样的:就 C 风格的转换而言,将函数 return 转换为 void
是否被视为规则的例外?或者我是否需要仔细检查我的代码,看看有问题的行是否实际上没有包含在这些构建中?
还好。
(void) f(x);
根据 [expr.static.cast]/6
:, 始终等同于 static_cast
Any expression can be explicitly converted to type cv void, in which case it becomes a discarded-value expression.
将函数的结果转换为 void
是 使表达式成为 discard-value-expression 的方法。现在,C++ 方式应该是 static_cast<void>(...)
但 (void) ...
是一个成语(而且更短)。
由于后者定义明确并且在代码库中非常常见,gcc1 和 clang2 使其成为 不触发Wold-style-cast
.
它定义明确,被主要编译器识别。没关系。
1) g++ documentation --- 3.5 Options Controlling C++ Dialect
-Wold-style-cast
(C++ and Objective-C++ only)
Warn if an old-style (C-style) cast to a non-void type is used within a C++ program. The new-style casts (dynamic_cast
, static_cast
, reinterpret_cast
, and const_cast
) are less vulnerable to unintended effects and much easier to search for.
Coverity 抱怨我们代码库中的各种函数调用没有检查 return 值。
Unchecked return value (CHECKED_RETURN)3. check_return: Calling Append without checking return value (as is done elsewhere 73 out of 78 times).
在过去,我们会通过将 return 转换为 void
(因为讨论 here):
(void)Foo.Append(bar);
但是,我们正朝着启用所有警告的方向努力,并且将警告视为错误,所以我有点担心上面的代码会生成一个 old-style-cast
诊断。如果是这样的话,我将需要将我们的代码修改为更丑陋的格式:
static_cast<void>( Foo.Append(bar) );
然而,gcc 和 clang 似乎都能够编译此代码(first 形式)没有抱怨。所以我想我的问题的最终形式是这样的:就 C 风格的转换而言,将函数 return 转换为 void
是否被视为规则的例外?或者我是否需要仔细检查我的代码,看看有问题的行是否实际上没有包含在这些构建中?
还好。
(void) f(x);
根据 [expr.static.cast]/6
:, 始终等同于 static_cast
Any expression can be explicitly converted to type cv void, in which case it becomes a discarded-value expression.
将函数的结果转换为 void
是 使表达式成为 discard-value-expression 的方法。现在,C++ 方式应该是 static_cast<void>(...)
但 (void) ...
是一个成语(而且更短)。
由于后者定义明确并且在代码库中非常常见,gcc1 和 clang2 使其成为 不触发Wold-style-cast
.
它定义明确,被主要编译器识别。没关系。
1) g++ documentation --- 3.5 Options Controlling C++ Dialect
-Wold-style-cast
(C++ and Objective-C++ only)
Warn if an old-style (C-style) cast to a non-void type is used within a C++ program. The new-style casts (dynamic_cast
,static_cast
,reinterpret_cast
, andconst_cast
) are less vulnerable to unintended effects and much easier to search for.