为什么将未使用的函数参数值转换为void?

110

在一些 C 项目中,我看到了这段代码:

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

这两个强制类型转换为void有什么作用吗?


投票关闭,因为正确答案(抑制编译器警告未使用的参数)在Charles的链接问题中。 - T.E.D.
19
实际上,这两个重复的内容都与这个问题无关。一个是关于C++,另一个则是关于返回值。它们并不是同一件事情。是否有任何关于C参数的重复内容? - Matt Joiner
2
这是一个不同于建议的重复问题的问题。我可以理解为什么会犯这个错误。已重新打开(显然)。 - Tim Post
请查看历史记录 - Antti Haapala -- Слава Україні
4
请注意:请不要将这个问题视为C++问题的重复,因为C++使用(void)的效果略有不同。这个问题是关于C语言的。 - Antti Haapala -- Слава Україні
显示剩余5条评论
2个回答

104

这是为了避免编译器警告一些未使用的参数。


3
如何最好地抑制警告信息:https://dev59.com/cHA75IYBdhLWcg3wOGLS - Ciro Santilli OurBigBook.com
1
@Benoit,将类型转换为void实际上是做什么的?它的唯一功能是向编译器表明您有意忽略某些内容吗?还是(void)实际上会做一些事情,当编译器看到它时,它会将其视为已对变量执行了某些操作,因此不会发出警告? - Tan Wang
3
它的唯一功能是告诉编译器你有意忽略某些东西,不会在运行时产生任何作用。 - zwol
有人知道这个在哪里有记录吗?语言规范?编译器手册?它有一个名称(这种语句)吗? - Kamil

17

原型中存在未使用的参数通常是因为函数需要符合某些外部API的要求,也许它是库函数,或者指向该函数的指针被传递给另一个期望这种调用约定的函数。然而,并不是所有由调用约定使用的参数实际上在函数本身中都是必需的。

在函数体中提到参数名称的原因是为了避免类似于警告的情况。

unused.c: In function ‘l_alloc’:
unused.c:3:22: warning: unused parameter ‘ud’ [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

可以使用函数体中的实际参数来抑制此警告。例如,若您有以下语句:

ud;

这个警告现在被抑制了。然而,现在GCC将产生另一个警告:

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

这个警告表示语句ud;在语法上是正确的C语言代码,但实际上不会对任何东西产生影响,可能是一个错误,就像下面的语句一样:

abort;

也许应该将其编写为abort();,以使其执行某些操作。

这就是 (void) 强制转换的作用 - 它将明确、明确地告诉编译器该语句实际上根本不会产生任何影响。


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