使用标记为__unused的参数时发出警告

时间:2013-01-24 01:53:02

标签: c clang

使用-Wunused参数标志,可以将__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似乎具有正确的值,尽管编译器可能没有利用提示,但如果没有更多的理解,我就不会依赖此行为。

2 个答案:

答案 0 :(得分:12)

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

GCC manual中使用的术语是:

  

此属性附加到函数,表示该函数可能未使用

for variables

  

此属性附加到变量,表示该变量可能未使用。

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

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

答案 1 :(得分:3)

另一种剥离此猫的方法是删除(或注释掉)参数的名称。

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

现在,编译器不会警告argv未使用,而无法使用它,因为它没有名称。