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

C++ 有没有办法阻止隐式指针转换为void*,c++,c,pointers,implicit-conversion,void-pointers,C++,C,Pointers,Implicit Conversion,Void Pointers,我需要在我的源代码中找到所有这样的地方,任何类型的指针都被隐式转换为void*,或者找到一种停止这些隐式转换的方法 例如: int*至void* char*至void* Base*至void* 是否有任何gcc警告或错误标志,用于检测指针隐式转换为void*的所有此类行?假设您有一个简单的程序,如 #include <string.h> int main() { char* apples = "apples and pears"; char fruit[1024];

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

例如:

  • int*
    void*
  • char*
    void*
  • Base*
    void*

  • 是否有任何gcc警告或错误标志,用于检测指针隐式转换为
    void*
    的所有此类行?

    假设您有一个简单的程序,如

    #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);
    }
    
    您将得到许多编译错误:包括隐式转换发生的位置。它不会发现void*=double*,因此您需要使用

    #define void int
    
    要找出其余部分。

    您可以尝试以下方法:

    gcc -Dvoid="struct doesnotexistanywhere" myfile.c
    
    这将抱怨从和到
    void*
    的所有隐式转换。至少在以下情况下会出现误报:

    void function( ...
    int function(void) { 
    (void)statement;
    
    可以使用
    grep
    筛选出相应的消息,也可以重构代码以排除这些情况


    不用说,即使编译以某种方式成功,也不应该使用生成的对象。在我的实验中,
    #包含
    d stdio.h、memory.h和string.h的程序编译得很干净,所以这确实是可能的,但标准明确禁止了这一点,谁知道编译器可以生成什么样的代码。

    我不知道,但这是个好主意。考虑到
    void*
    的危险性,实际上不应该隐含转换为
    void*
    ,但是历史…
    grep”(void*)“*-R
    ?@JamesKanze:危险并不真正在于转换为
    void*
    ,而是在于随后从
    void*
    转换回错误的类型。后者已经使用g++生成了一个错误,并且该标志还可以用于使用gcc生成警告。好吧,前者不能为gcc或g++生成警告或错误。@Dabo这不是很含蓄。在我看来,这似乎是一个非常有效的上溯:
    myVoidPtr=myIntPtr。Type
    void*
    只是表示“我不在乎引用的是什么类型的数据”;任何类型都可以。如果您觉得这是一件坏事,那么不要在程序中使用类型为
    void*
    的变量和参数。我真的很好奇您的用例。它不会发现从
    char[1024]
    void*
    的隐式转换,用于将
    水果
    传递到
    memcpy
    ,除非您在包含
    string.h
    之前定义它。如果这样做,可能会出现链接器错误(对于更复杂的函数)或其他内部函数问题。你每天都会学到新东西。
    void function( ...
    int function(void) { 
    (void)statement;