相关疑难解决方法(0)

为什么Visual C++会在C中警告从const void**到void*的隐式转换,而不是在C++中?

摘要

当C程序尝试将指针转换为指向数据(如或)的指针时,Microsoft Visual Studio中的C/C++编译器会发出警告C4090(即使这样的类型实际上不是指针).更奇怪的是,同一个编译器默默接受编译为C++的相同代码.constconst void **const char **void *const

什么是这种不一致的原因,以及为什么Visual Studio的(不像其他编译器)有隐含转换的指针指向一个问题constvoid *

细节

我有一个C程序,其中在变量参数列表中传递的C字符串被读入一个数组(通过va_arg调用的循环).由于C字符串是类型const char *,跟踪它们的数组是类型const char **.这个带有const内容的字符串指针数组本身是动态分配的(带calloc)和I free它在函数返回之前(在处理完C字符串之后).

当我使用cl.exe(在Microsoft Visual C++中)编译此代码时,即使警告级别较低,该free调用也会触发警告C4090.因为free需要一个void *,这告诉我编译器不喜欢我已经转换const char **为a void *.我创建了一个简单的例子来证实这一点,我尝试将a转换const void **void *:

/* cast.c - Can a const void** be cast …
Run Code Online (Sandbox Code Playgroud)

c c++ const visual-studio visual-c++

18
推荐指数
1
解决办法
2441
查看次数

标签 统计

c ×1

c++ ×1

const ×1

visual-c++ ×1

visual-studio ×1