88

考虑以下 C++ 代码:

void* a = &a;

为什么编译器不抱怨使用未声明的标识符?

另外,编译器认为变量a是什么?它是指向 void 对象的指针还是指向指针的void*指针?

4

3 回答 3

95

C++ 中变量声明的范围可能非常令人惊讶:

void* a =               &a;
         ^~~~~~~~~~~~~~~~~
          a declared as `void*` from here on

因此,&aisvoid**但是因为任何指针类型都可以隐式转换为void*...

于 2013-08-14T06:40:08.983 回答
30

它相当于

void* a;
a = &a;

因此,a已经宣布。所以a得到a写入的地址a。所以它是一个指向 void 指针的指针。(您还没有定义任何对象。)

于 2013-08-14T06:39:22.843 回答
7

In void* a,a被声明为不是指向void类型而是指向“任何”类型的指针(特殊情况)。a当然,对于声明的任何其他变量,地址(内存中的位置)被分配给。

之后,&a计算表达式以初始化a刚刚声明的变量(也是,但这不相关)。的类型&a是“指向任意类型的指针”,是“指向任意类型的指针”的特例,与 的类型完全兼容a。因此,没有编译器消息。

void*推论:如果您想要强类型检查, 请不要使用。任何东西都可以转换为它。在相反的方向上正好相反,除了void*它自己(类型与自身不兼容将是一个不必要的例外)。

此外,AFAIR 这真的来自 C。

于 2013-08-14T06:42:12.863 回答