无效 *a = &a 如何合法?
How is void *a = &a legal?
本文关键字:无效 更新时间:2023-10-16
考虑以下C++代码:
void* a = &a;
为什么编译器不抱怨使用了未声明的标识符?
此外,编译器认为变量a
是什么?它是指向void对象的指针还是指向void*
指针的指针?
C++中变量声明的范围可能非常令人惊讶:
void* a = &a;
^~~~~~~~~~~~~~~~~
a declared as `void*` from here on
因此,&a
是void**
,但由于任何指针类型都可以隐式转换为void*
。。。
它相当于
void* a;
a = &a;
因此,已声明a
。所以a
得到a
中写入的a
的地址。所以它是一个指向空指针的指针。(您还没有定义任何对象。)
在void* a
中,a
被声明为不是指向void
类型而是指向"any"类型的指针(特殊情况)。地址(存储器中的位置)被分配给a
,当然,就像被声明的任何其他变量一样。
之后,表达式&a
被求值以初始化刚刚声明的变量(也是a
,但这并不相关)。&a
的类型为"指针到任何类型的指针",这是"指针到任意类型"的特殊情况,与a
的类型完全兼容。呃,没有编译器消息。
推论:如果要进行强类型检查,请不要使用void*
任何都可以转换为它。相反,除了void*
本身(类型与自身不兼容是不必要的例外)。
此外,AFAIR这确实来自C.
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 数组下标的类型"float*[float]"无效
- 修改 std::vector 会使迭代器无效吗?