(void)var实际上做了什么?

Dit*_*iti 15 c void c89

请考虑以下事项main():

int main(int argc, char *argv[])
{
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

在编译时cc -Wall -Wextra,会生成警告"未使用的参数".

当我不需要在函数中使用参数时(例如在不使用其参数的信号处理函数int),我习惯于执行以下操作:

  int main(int argc, char *argv[])
  {
      (void)argc;
      (void)argv;
      return (0);
  }
Run Code Online (Sandbox Code Playgroud)

(对于特定的main(),我有时看到别人做的:argv = argv - argc + argc)

但是,是什么(void)var真正

我明白这(void)是一个演员,所以我想我正在抛弃变量?什么是var;线(不投)呢?这是一个空任务,一个空表达式?

我想了解实际发生了什么.

JVM*_*ATL 15

它只是一种创建对变量的"无害"引用的方法.编译器不会抱怨未使用的变量,因为你确实引用了这个值,并且它没有抱怨你没有对表达式的值做任何事情,var因为你明确地将它转换为void(无),表明你不关心这个价值.

我之前没有在变量上看到过这种用法(因为我使用的编译器通常不会抱怨未使用的函数参数,但是我看到这经常用于向编译器表明你并不真正关心的返回值一个功能.printf(),例如,返回一个值,但99%的C程序员不知道(或关心)它返回的内容.为了使一些繁琐的编译器或lint工具不抱怨未使用的返回值,您可以将返回值强制转换为void,以表明您知道它在那里,并且您明确地不关心它.

除了将您的意图(您不关心此值)传达给编译器之外,它实际上并没有任何事情 - 它只是对编译器的一个提示.


oua*_*uah 5

  (void)argc;
  (void)argv;
Run Code Online (Sandbox Code Playgroud)

如果未使用函数自变量(例如在您的程序中),则这是抑制某些编译器发出的未使用函数自变量的警告的惯用方式。任何体面的编译器都不会使用这些语句生成代码。

它评估参数,但不执行任何操作,这会使大多数编译器不发出警告。使用了(void)强制类型转换,因此编译器不会再产生警告,通知您未使用该值。

抑制警告的另一种流行方法是:

variable = variable;
Run Code Online (Sandbox Code Playgroud)

请注意,我知道一些编译器会在存在以下情况时发出另一个警告:

(void) arg;
Run Code Online (Sandbox Code Playgroud)

例如“声明无效”。