我试图理解下面的C代码。
static unsigned
parent(const struct binheap *bh, unsigned u)
{
(void)bh;
return (u / 2);
}
(void)bh;
的目的是什么?它没有分配给任何东西,不应该对输出产生影响。我能想到的唯一目的可能是作为一种对空指针的断言。
对于上下文,该代码段来自the original implementation的B-heap。该代码在其他地方也往往过于聪明,例如让for (unsigned n = 2; n; n += n) {
在n = 65536处打破。
答案 0 :(得分:1)
这通常用于避免编译器警告。例如,如果使用-Wall -Wextra
中的gcc
进行编译,则会警告您未使用bh
如果您没有将演员阵容视为无效。
答案 1 :(得分:1)
这只是为了避免编译器警告未使用的变量。如果没有强制转换,编译器将(尝试)警告您在代码中有一个未使用的变量。
答案 2 :(得分:1)
(void)bh;
在生成的代码中无效。但是,对于许多编译器,它将阻止编译器发出关于参数bh
的警告,而不是在函数中另外使用,这几乎肯定是程序员的意图。 bh
是结构指针是无关紧要的;如果这种技术起作用,无论未使用的参数的类型如何,它都将起作用。
C ++有一种更优雅的方法来实现这一点,允许你省略你不需要的任何参数的变量名 -
static unsigned
parent(const struct binheap *, unsigned u)
{
return (u / 2);
}
- 但C不支持此功能。一些编译器具有用于相同目的的扩展,如果不是那么优雅,则至少更自我描述,例如, GCC' S
static unsigned
parent(const struct binheap *bh __attribute__((unused)), unsigned u)
{
return (u / 2);
}
(void)bh;
技巧是唯一一种抑制仅使用ISO C设施的未使用参数警告的技术;另一方面,它不能保证工作,编译器发出的警告完全取决于编译器,所以无论你做什么,你都已经处于实现定义的区域。
答案 3 :(得分:1)
因为编译器警告
当函数中未使用变量时,某些编译器会发出警告。见下文
#include <stdio.h>
void hello(int a, int b)
{
int i = b + 1;
printf("hello %d\n", i);
return;
}
int main(void)
{
hello(10, 20);
return 0;
}
按以下方式编译,以查看警告
$ gcc -Wunused-parameter a.c
a.c:3:16: warning: unused parameter 'a' [-Wunused-parameter]
void hello(int a, int b)
^
1 warning generated.