考虑以下 C++ 代码:
void* a = &a;
为什么编译器不抱怨使用未声明的标识符?
另外,编译器认为变量a
是什么?它是指向 void 对象的指针还是指向指针的void*
指针?
考虑以下 C++ 代码:
void* a = &a;
为什么编译器不抱怨使用未声明的标识符?
另外,编译器认为变量a
是什么?它是指向 void 对象的指针还是指向指针的void*
指针?
C++ 中变量声明的范围可能非常令人惊讶:
void* a = &a;
^~~~~~~~~~~~~~~~~
a declared as `void*` from here on
因此,&a
isvoid**
但是因为任何指针类型都可以隐式转换为void*
...
它相当于
void* a;
a = &a;
因此,a
已经宣布。所以a
得到a
写入的地址a
。所以它是一个指向 void 指针的指针。(您还没有定义任何对象。)
In void* a
,a
被声明为不是指向void
类型而是指向“任何”类型的指针(特殊情况)。a
当然,对于声明的任何其他变量,地址(内存中的位置)被分配给。
之后,&a
计算表达式以初始化a
刚刚声明的变量(也是,但这不相关)。的类型&a
是“指向任意类型的指针”,是“指向任意类型的指针”的特例,与 的类型完全兼容a
。因此,没有编译器消息。
void*
推论:如果您想要强类型检查, 请不要使用。任何东西都可以转换为它。在相反的方向上正好相反,除了void*
它自己(类型与自身不兼容将是一个不必要的例外)。
此外,AFAIR 这真的来自 C。