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代码>。Typevoid*
只是表示“我不在乎引用的是什么类型的数据”;任何类型都可以。如果您觉得这是一件坏事,那么不要在程序中使用类型为void*
的变量和参数。我真的很好奇您的用例。它不会发现从char[1024]
到void*
的隐式转换,用于将水果
传递到memcpy
,除非您在包含string.h
之前定义它。如果这样做,可能会出现链接器错误(对于更复杂的函数)或其他内部函数问题。你每天都会学到新东西。
void function( ...
int function(void) {
(void)statement;