【发布时间】:2011-11-06 02:16:23
【问题描述】:
如解释,例如here,void 关键字有 3 个主要用途(更有经验的 C/C++ 程序员可以跳到第 4 个用途):
1) 作为不返回任何内容的函数的返回类型。这 将导致这样的代码示例:
void foo();
int i = foo();
生成编译器错误。
2) 作为函数参数列表中的唯一参数。 AFAIK,空函数的参数列表与编译器完全相同,因此以下两行含义相同: (编辑:这仅在 c++ 中是正确的。cmets 显示了 c 中的差异)。
int foo();
int foo(void);
3) void* 是一种特殊类型的泛型指针——它可以指向任何未使用 const 或 volatile 关键字声明的变量,转换为/从任何类型的数据指针,以及指向所有非成员函数。此外,它不能被取消引用。我就不举例了。
还有第四个用途我不完全理解:
4) 在条件编译中常用于表达式(void)0,如下:
// procedure that actually prints error message
void _assert(char* file, int line, char* test);
#ifdef NDEBUG
#define assert(e) ((void)0)
#else
#define assert(e) \
((e) ? (void)0 : \
__assert(__FILE__, __LINE__, #e))
#endif
我试图通过实验来理解这个表达式的行为。以下都是有效的(编译好):
int foo(); // some function declaration
int (*fooPtr)(); // function pointer
void(foo);
void(fooPtr);
void(0);
(void)0;
void('a');
void("blabla");
exampleClass e; //some class named exampleClass with a default ctor
void(e);
static_cast<void>(e);
但这些不是:
void(0) // no semicolon
int i = void(0);
我可以由此得出结论,“void”(在第四次使用的上下文中) 只是一种特殊类型,任何类型都可以转换为它(无论是 c-style 还是 cpp- style),它永远不能用作左值或右值?
【问题讨论】:
-
2 仅适用于 C++,在 C 中,空函数的参数列表意味着该函数采用任意数量的未指定参数。
-
您还可以从返回类型为
void的函数返回计算结果为void的表达式。 -
最后一个问题的答案是否定的:
void()创建了一个void类型的右值。 -
@KerrekSB:
void(e)==(void)e==static_cast<void>(e)。表示故意不使用变量是一种常见的习惯用法。 -
我认为尝试理解
void本身的含义并不值得。它只是一个关键字,在不同的上下文中意味着不同的事物。同样,关键字static在 C++ 中意味着 8 种不同的东西,我认为您不会找到一个完全解释它的定义。