有没有办法阻止隐式指针转换为void *

时间:2014-04-30 09:10:30

标签: c++ c pointers implicit-conversion void-pointers

我需要在源代码中找到所有这些位置,其中任何类型的指针都隐式转换为void *或者是一种停止这些隐式转换的方法。

例如:

  1. int *void *
  2. char *void *
  3. Base *void *
  4. 是否有 gcc 警告或错误标志,它会检测指针隐式转换为void *的所有此类行?

2 个答案:

答案 0 :(得分:4)

假设你有一个像

这样的简单程序
#include <string.h>
int main()
{
   char* apples = "apples and pears";
   char fruit[1024];
   void* avoid;
   int aint;
   float afloat;

   avoid = &aint;
   avoid = &afloat;
   memcpy(fruit, apples, strlen(apples) + 1);
}

这是一个技巧,可以告诉你一些隐含的转换发生在哪里。在程序开头添加它

#define void double

您将收到大量编译错误:包括隐式转换发生的位置。它不会发现void * = double *所以你需要再次尝试

#define void int

发现其余部分。

答案 1 :(得分:0)

你可以试试这个:

gcc -Dvoid="struct doesnotexistanywhere" myfile.c

这会抱怨来自void*的所有隐式转化。至少在这些情况下会出现误报:

void function( ...
int function(void) { 
(void)statement;

可以使用grep过滤掉相应的消息,或者您可以重构代码以排除这些情况。

毋庸置疑,即使编译以某种方式成功,也不应该使用生成的对象。在我的实验中,#include stdio.h,memory.h和string.h编译得很干净,所以这确实是可行的,但标准明确禁止这个,谁知道编译器可以生成什么样的代码