在C语言中定义未使用的参数

8

我需要使用pthread,但是不需要向函数传递任何参数。因此,我在pthread_create函数中将参数设置为NULL。我有7个pthread,所以gcc编译器会警告我有7个未使用的参数。在C编程中如何定义这7个参数为未使用?如果不将这些参数定义为未使用,是否会导致问题?非常感谢您的回应。

void *timer1_function(void * parameter1){
//<statement>
}

int main(int argc,char *argv[]){
  int thread_check1;
  pthread_t timer1;
  thread_check1 = pthread_create( &timer1, NULL, timer1_function,  NULL);
    if(thread_check1 !=0){
        perror("thread creation failed");
        exit(EXIT_FAILURE);
    }
while(1){}
return 0;
}

如果它们未被使用,这意味着这些变量没有进行任何有意义的操作,因此它们大部分情况下是可以安全地删除的。这只是一个警告而不是错误,所以它可以被忽略。通常来说,忽略它并不是一个好主意,但你可以这样做。 - Makoto
@hmjd - C++ 允许这样做,而 C 不允许。 - MByD
2
https://dev59.com/z2w05IYBdhLWcg3wszsl - Flexo
可能是在C/C++中实现UNUSED宏的通用编译器独立方法的重复问题。 - Michael Burr
5个回答

19

您可以像这样将参数强制转换为void:

void *timer1_function(void * parameter1) {
  (void) parameter1; // Suppress the warning.
  // <statement>
}

3
https://dev59.com/wG445IYBdhLWcg3wcaAN#4851173 有一种替代形式,似乎更适合用于 volatile - Flexo

18

GCC提供了一个“属性”功能,可用于标记未使用的参数。使用

void *timer1_function(__attribute__((unused))void *parameter1)

2

常用的两种技术:

1)省略未使用参数的名称:

void *timer1_function(void *) { ... }

2) 将参数名称注释掉:

void *timer1_function(void * /*parameter1*/) { ... }

-- Chris(克里斯)

1
如果我这样做(在C11中),会得到“省略参数名”。我很确定这对于C而言是无效的(而不是C ++)。 - Duncan Jones

1

默认情况下,GCC甚至在使用-Wall选项时也不会产生此警告。我认为在您无法控制环境的情况下,可能需要其他问题中显示的解决方法,但如果您可以控制环境,请删除标志(-Wunused-parameter)。


+1 这是最好的修复。这个警告基本上很愚蠢。每当函数的地址被获取时,GCC 应该为其关闭“未使用的参数”警告,因为无论它们是否在内部使用,它们都作为函数所需接口的一部分而被使用。就我个人而言,我认为所有外部函数也应该适用于同样的规则... - R.. GitHub STOP HELPING ICE
3
几天前,多亏了这个警告,我发现了我的代码中的一个bug。我正在重构一些函数,不小心在一个函数参数中输入0代替了位掩码的标识符。开启-Wextra选项使我能够立即修复一个已经存在几天的微妙bug。 - Kyle Jones
2
-1:由于这个警告被激活,我经常发现错误。 - Étienne
1
对于多年前编写的代码并且经过修改...随着时间的推移,有时会添加参数,但后来却没有使用,因此这个警告非常有用,特别是当将某些参数传递给函数(查找或计算)变得很麻烦时,只需发现它甚至没有被使用。 - ideasman42

0

在函数体中不使用参数是完全可以的。

为了避免编译器警告(如果在您的实现中有任何警告),您可以这样做:

void *timer1_function(void * parameter1)
{
    // no operation, will likely be optimized out by the compiler
    parameter1 = parameter1;  
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接