代码之家  ›  专栏  ›  技术社区  ›  sanjoyd

虚空的怪异运用

  •  11
  • sanjoyd  · 技术社区  · 14 年前

    void some_func (char *foo, struct bar *baz)
    {
        (void)foo;
        (void)baz;
    }
    

    为什么 void 用在这里?我知道 (void) 在表达式显式指示值为 ;但有人能解释一下这种用途的理由吗?

    3 回复  |  直到 14 年前
        1
  •  22
  •   Eugene Smith    14 年前

    这段代码确保您不会收到关于foo和baz未使用的编译器警告。

        2
  •  8
  •   blucz    14 年前

        3
  •  6
  •   paxdiablo    14 年前

    这些变量出现在函数中的最可能原因是删除了关于未使用参数的任何警告。

    然而,由于这可能会引入 另一个 警告(因为您可能使用的警告级别高于正常警告级别),所以作者还将执行一个额外的步骤来删除这些警告级别。

    在C语言中,语句

    42;
    

    int main (void) {
        42;
        return 0;
    }
    

    它(通常)不会抱怨。但是,如果使用 gcc -Wall -pedantic (例如),您将得到如下信息:

    prog.c: In function `main':
    prog.c:2: warning: statement with no effect
    

    (void) 42; 将明确声明您不关心该值。

    我在一些坚持使用这种方法的分析器上看到过,因为 printf 实际上返回一个值,您一定是疯了忽略它,导致这样的暴行:

    (void)printf ("Hello, world.\n");
    (void)strcpy (dest, src);
    

    :-)


    例如,如果编译:

    void some_func (char *foo) {}
    int main (void) { some_func (0); return 0; }
    

    gcc -Wall -W -pedantic ,您将得到:

    warning: unused parameter `foo'
    

    如果“使用”参数:

    void some_func (char *foo) { foo; }
    

    warning: statement with no effect
    

    但是,如果使用参数并显式忽略结果:

    void some_func (char *foo) { (void)foo; }