8

在以下函数中

int f (some_struct* p)
{
    (void) p;
    /* something else */
    return 0;
}

声明是什么

(void) p; 

意思是?

4

4 回答 4

12

该语句在运行时不执行任何操作,并且不会产生任何机器代码。

p它禁止在函数体中未使用的编译器警告。这是一种可移植且安全的方法,可以在各种不同的编译器(包括 GCC、Clang 和 Visual C++)中抑制此警告。

于 2013-08-30T00:21:56.913 回答
2

“Cast to void”是一种 C 语言习语,按照惯例,它禁止编译器和lint有关未使用变量或返回值的警告。

在这种情况下,正如 Dietrich Epp 正确指出的那样,它告诉编译器您知道您没有使用参数p,并且不会给您“未使用的参数”警告。

这个习语的另一种用法,将函数的返回值强制转换为void,是告诉lint或者更重要的是,其他程序员你已经有意识地决定不去检查函数的返回值的传统方式。例如:

(void)printf("foo")

意思是“我知道printf()返回一个值,我真的应该检查它,但我决定不打扰”。

于 2013-08-30T00:31:37.293 回答
0

告诉编译器void或 lint 不发出警告。如果有一个变量从未使用过,编译器或 lint 会建议您删除它。

如果不想删除,可以使用void。喜欢链接:如何在 GCC 中隐藏“已定义但未使用”的警告?

于 2013-08-30T01:23:33.053 回答
0

It's used to avoid the warning of unused function parameter. It simply gets discarded, does nothing except that the expression has a side effect.

C11 §6.3.2.2 void

The (nonexistent) value of a void expression (an expression that has type void) shall not be used in any way, and implicit or explicit conversions (except to void) shall not be applied to such an expression. If an expression of any other type is evaluated as a void expression, its value or designator is discarded. (A void expression is evaluated for its side effects.)

Another way to avoid the warning of unused function parameter is:

p = p;
于 2013-08-30T01:04:58.623 回答