这里的 (void)(p) 是做什么用的?

3

我在检查代码时遇到了以下片段:

int check(char *a)
{

    (void)(a);//What is this line doing??
    return 0;
}

int main(void) 
{

    char *p;
    p=(char *)malloc(sizeof(char));
    check(p);
    return 0;
}

What is (void)(a); doing?


这是 check全部内容吗?如果只有这些,它实际上并没有检查任何东西。也许它是不完整的。 - user2357112
3个回答

6

一些编译器在函数中出现未使用的参数时可能会发出警告,使用(void)a可以消除这种警告。

另一个常见的方法是:

int check(char *a)
{
    a = a;
    return 0;
}

更好的做法是,#define UNUSED_VAR(x) (void)x - glampert
1
更好的做法是,#define UNUSED_VAR(x) (void)(x) - Cody Gray

4

这段代码是为了消除编译器警告未使用的变量 'a'

这不是一种标准技术,它依赖于特定使用的编译器。虽然可以在编译器中关闭此警告,但有些人认为编译器诊断未使用的变量是有用的信息,因此使用此技术来表示变量故意未使用且他们不想看到警告。

正如glampert建议的那样,我认为使用一个名字为UNUSED_VAR的宏更加清晰,这样读者就不会疑惑发生了什么。这种方法还具有一个优点,您可以在头文件中为各种编译器定义它。


这不是标准技术吗?这与我的经验相矛盾。当然,并不是每个人都使用它,但这并不意味着它是非标准的。在哪些编译器上它不能工作? - Cody Gray
我的意思是,C语言标准并没有表示这段代码保证可以抑制编译器警告。我没有尝试过所有现有的编译器和未来可能发布的所有编译器,所以我无法回答你的最后一个问题。 - M.M

1

(void)(a);什么也不做,并且会被编译器删除。

在这种情况下,它的目的是显示它没有被使用,但这是有意的。此外,它还将抑制任何编译器警告,指出变量未使用。


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