在不同的编译器上转换为void **

问题描述 投票:3回答:1

我已经通过不同的编译器运行以下代码:

int main()
{
    float **a;
    void **b;
    b = a;
}

根据我的能力,void **不是通用指针,这意味着来自另一个指针的任何转换都不应编译或至少发出警告。但是,这是我的结果(全部在Windows上完成):

  • gcc-引发警告,如预期。
  • g ++-引发错误,如预期的那样(这是由于C ++输入的权限较低,对吧?)
  • MSVC(cl.exe)-即使指定了/ Wall,也不会发出任何警告。

我的问题是:我是否遗漏了全部内容?是否有任何特定原因导致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,因此代码编译时不会发出警告。
c++ c cuda
1个回答
0
投票
我是否遗漏了整件事,是否有任何特定原因导致MSVC无法发出警告?从无效**转换为浮动**时,MSVC会产生警告

推荐问答