小编Cap*_*n42的帖子

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

我一直在通过不同的编译器运行以下代码:

int main()
{
    float **a;
    void **b;
    b = a;
}
Run Code Online (Sandbox Code Playgroud)

从我已经能够收集,void **不是一个普通的指针,这意味着从另一个指针任何转换不应该编译或至少抛出一个警告。但是,这是我的结果(全部在 Windows 上完成):

  • gcc - 按预期抛出警告。
  • g++ - 正如预期的那样抛出一个错误(这是因为 C++ 的类型不太宽松,对吧?)
  • MSVC (cl.exe) - 即使指定了 /Wall,也不会发出任何警告。

我的问题是:我是否遗漏了整件事,MSVC 不产生警告有什么具体原因吗?MSVC转换时产生警告 void **float **

另一件值得注意的事情:如果我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);
Run Code Online (Sandbox Code Playgroud)

它应该执行到void **for的隐式转换&d_A,因为的第一个参数cudaMalloc是类型void **。类似的代码可以在整个文档中找到。这只是 …

c c++ cuda

9
推荐指数
1
解决办法
296
查看次数

标签 统计

c ×1

c++ ×1

cuda ×1