微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对于未使用的参数,什么是“更好的”:(x=x) 或 (void(x))?

如何解决对于未使用的参数,什么是“更好的”:(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 举报,一经查实,本站将立刻删除。