在不使用结果的情况下将结构指针强制转换为void的目的

时间:2016-09-27 20:13:06

标签: c pointers casting void

我试图理解下面的C代码。

static unsigned
parent(const struct binheap *bh, unsigned u)
{
    (void)bh;
    return (u / 2);
}

(void)bh;的目的是什么?它没有分配给任何东西,不应该对输出产生影响。我能想到的唯一目的可能是作为一种对空指针的断言。

对于上下文,该代码段来自the original implementationB-heap。该代码在其他地方也往往过于聪明,例如让for (unsigned n = 2; n; n += n) {在n = 65536处打破。

4 个答案:

答案 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.