如何使编译器不显示int到void指针强制转换警告

Jea*_*lho 9 c gcc void-pointers

我有一些代码可以执行从int到void*的大量转换,反之亦然(我不在乎它是否丑陋.我喜欢通用的东西)

例:

typedef struct _List {
    long size;
    long mSize; // Max size
    void** elementArray;
}List;

List l;
...
int i = 2;
l.elementArray[i] = i; // Intentional usage of pointer as integer
// Actual size of pointer does not matter
Run Code Online (Sandbox Code Playgroud)

但是当我编译我得到一个bajillion

 warning: cast to 'void *' from smaller integer type 'int' [-Wint-to-void-pointer-cast]
Run Code Online (Sandbox Code Playgroud)

警告.是否有一面旗帜告诉gcc不打印此特定警告?

我正在和-Wall进行编译,所以我不确定我是否能够轻松地让它消失

Dan*_*imm 16

为了那些可能正在寻找像我这样的答案的人:

如果你不想添加一个额外的编译标志,因为你可能会在其他地方意外地将一个面试转发到一个void*,你可以使用下面的片段强制从一个int转换为void*你确定你希望它发生,然后编译器不会错误的演员:

#define INT2VOIDP(i) (void*)(uintptr_t)(i)
Run Code Online (Sandbox Code Playgroud)

当然一定要包含stdint.h,这样你就可以做到以下几点:

void *val = INT2VOIDP(5);
Run Code Online (Sandbox Code Playgroud)


Jea*_*lho 9

显然只是采取编译器给你的标志并在它前面拍了一个"不"就行了!

-Wno-int-to-void-pointer-cast
Run Code Online (Sandbox Code Playgroud)

  • 是的,这就是它的用途。但我会非常犹豫是否要打开那个开关……这个特殊的警告“经常”表明真实的,诚实的,你不能那样做——会爆炸的错误。 (4认同)

小智 7

你可能想要使用'size_t'.

例如,如果你有int i和void*a,

i = (void *) a; 会给你那个警告

避免这个添加size_t

i = (void *) (size_t) a;