我已经通过不同的编译器运行以下代码:
int main()
{
float **a;
void **b;
b = a;
}
根据我的能力,void **
是不是通用指针,这意味着来自另一个指针的任何转换都不应编译或至少发出警告。但是,这是我的结果(全部在Windows上完成):
我的问题是:我是否遗漏了全部内容?是否有任何特定原因导致MSVC无法发出警告?将[[从 void **
转换为float **
时,MSVC does会产生警告。
a = b
替换为显式转换a = (void **)b
,则所有编译器都不会发出警告。我以为这应该是无效的演员,所以为什么不会有任何警告?我问这个问题的原因是因为我开始学习CUDA,并且在官方编程指南(https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory)中可以找到以下代码:
// Allocate vectors in device memory
float* d_A;
cudaMalloc(&d_A, size);
它应该对void **
执行隐式转换为&d_A
,因为cudaMalloc
的第一个参数的类型为void **
。在整个文档中都可以找到类似的代码。这只是NVIDIA的草率工作,还是我又错过了什么?由于nvcc
使用MSVC,因此代码编译时不会发出警告。
我是否遗漏了整件事,是否有任何特定原因导致MSVC无法发出警告?从无效**转换为浮动**时,MSVC会产生警告