如何解决对于未使用的参数,什么是“更好的”:(x=x) 或 (void(x))?
我们都知道,有时我们会获取函数的参数,但我们并没有真正使用它们。
我们不想收到任何编译器警告,所以我们需要以某种方式“使用”但不真正使用这些参数。
我们有两种选择:
#define UNUSED(x) (void)(x)
#define UNUSED(x) (x=x)
一般来说,
在函数中定义 (x=x)
或 void(x)
,即使没有 #define
。
问题是:
以下哪个“更好”?
更好的性能(更快)、内存分配(如果有),以及任何你能想到的技术上的说法。
解决方法
(void)x
是标准的一部分,所以应该更好。使用它时,您不会收到编译器/linters 警告。它也是可移植的,与 __attribute__((unused))
等特定于实现的解决方案不同,它不会生成任何代码。 x = x
可能会产生警告。
关于可以为 x=x
发出的警告的示例:
int foo(int bar)
{
bar = bar;
return 1;
}
int main()
{
return foo(2);
}
使用 Clang 10 使用 -Wall
(或仅使用 -Wself-assign
)编译上述代码会触发以下警告:
$ clang test.c -Wall
test.c:3:9: warning: explicitly assigning value of variable of type 'int' to itself [-Wself-assign]
bar = bar;
~~~ ^ ~~~
同样适用于 cppcheck
之类的短绒:
$ cppcheck test.c --enable=all
Checking test.c ...
test.c:3:9: warning: Redundant assignment of 'bar' to itself. [selfAssignment]
bar = bar;
^
test.c:3:9: style: Variable 'bar' is assigned a value that is never used. [unreadVariable]
bar = bar;
^
当然,这些取决于您使用的工具和您启用的警告,因此它可能会或可能不会生成警告,但将表达式转换为 void
永远不会生成此类警告。
以下哪个“更好”?
#define UNUSED(x) (void)(x)
因为不管怎样,这对于你正在做的事情来说几乎是标准的。
更好的性能(更快)、内存分配(如果有),以及任何你能想到的技术上的说法。
如果您启用了优化,如果您关心性能,您应该这样做,无论如何这些东西都会被优化掉。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。