c语言 - 未使用的参数"better":(x=x)或(void(x))是什么?



我们都知道,有时我们得到函数的参数,但我们并不真正使用它们。

我们不想得到任何编译器警告,所以我们需要以某种方式使用"但不要真正使用这些参数。

我们有两个选择:

#define UNUSED(x) (void)(x)

#define UNUSED(x) (x=x)

,一般来说,在函数中定义(x=x)void(x),即使没有#define

问题是:

哪一个"更好"?

更好的性能(更快),内存分配(如果有的话),任何你能想到的技术说话。

(void)x是标准的一部分,所以它应该更好。当你使用它时,你不会得到编译器/编译器警告。它也是可移植的,不像__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)

因为这几乎是你所做的事情的标准。

更好的性能(更快),内存分配(如果有的话),任何你能想到的技术说话。

如果你激活了优化,如果你关心性能,你应该这样做,这些东西无论如何都会被优化掉。

相关内容

  • 没有找到相关文章

最新更新