8

使用 -Wunused-parameter 标志,您可以强制 __unused 用于未使用的参数,作为编译器优化。以下代码会导致两个警告:

#include <stdio.h>
int main(int argc, char **argv) {
  printf("hello world\n");
  return 0;
}

通过添加 __unused 未使用的参数来修复这些警告。

#include <stdio.h>
int main(int __unused argc, char __unused **argv) {
  printf("hello world\n");
  return 0;
}

当您使用标记为 __unused 的参数时,clang 4.1 不会发出警告或错误。

#include <stdio.h>
int main(int __unused argc, char __unused **argv) {
  printf("hello world. there are %d args\n", argc);
  return 0;
}

使用 展示相同的行为__attribute__((unused))

int main(int __attribute__((unused)) argc, char __attribute__((unused)) **argv) {

有没有办法在 __unused 上发出警告或错误?如果您不小心在已使用的参数上留下了 __unused 会发生什么?在上面的示例argc中似乎具有正确的值,尽管它可能是编译器没有利用提示,我不会在没有更多理解的情况下依赖这种行为。

4

2 回答 2

12

__unused属性旨在防止在函数/方法或函数/方法的参数未使用时出现投诉,而不是强制它们不使用。

GCC 手册中使用的术语是:

附加到函数的此属性意味着该函数可能未被使用

对于变量

附加到变量的此属性意味着该变量可能未被使用。

最常见的用途是针对接口进行开发 - 例如回调,您可能被迫接受几个参数但不使用所有参数。

我在进行测试驱动开发时会使用它——我的初始例程需要一些参数并且什么都不做,所以所有参数都取__attribute__((unused)). 当我开发它时,我会使用这些参数。在开发结束时,我将它们从方法中删除,看看会发生什么。

于 2013-01-25T00:35:17.390 回答
3

给这只猫换皮的另一种方法是删除(或注释掉)参数的名称。

int main ( int argc, char ** /* argv */ ) {
    printf("hello world. there are %d args\n", argc);
    return 0;
}

现在编译器不会警告argv未使用,你也不能使用它,因为它没有名字。

于 2013-01-28T22:03:26.467 回答