Как заставить компилятор не показывать предупреждения int to void pointer cast

у меня есть код, который делает много кастинга от 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

но когда я компилирую, я получаю bajillion

 warning: cast to 'void *' from smaller integer type 'int' [-Wint-to-void-pointer-cast]

предупреждения. Есть ли флаг, чтобы сказать GCC, чтобы не печатать это предупреждение?

я компилирую с-Wall, поэтому я не уверен, что могу сделать это уйти, что легко

5 ответов


ради других, которые, возможно, ищут ответ, как я:

Если вы не хотите добавлять дополнительный флаг компиляции из-за того, что вы можете передавать интервью в пустоту* случайно где-то еще, вы можете использовать следующий фрагмент, чтобы заставить приведение из int в пустоту*, где вы уверены, что хотите, чтобы это произошло, и тогда компилятор не будет вас беспокоить о приведении:

#define INT2VOIDP(i) (void*)(uintptr_t)(i)

конечно, обязательно включите stdint.h, так что вы можете сделать следующий:

void *val = INT2VOIDP(5);

по-видимому, просто возьмите флаг, который компилятор дает вам, и хлопните "нет" перед ним, делает трюк!

-Wno-int-to-void-pointer-cast

возможно, вы захотите использовать 'size_t'.

например, если у вас есть int i и void *a,

i = (void *) a; даст вам предупреждение

чтобы избежать этого добавьте в size_t

i = (void *) (size_t) a;


в некоторых случаях это было бы желательно (например . для последнего параметра указателя glVertexAttribPointer в OpenGL). Вы должны быть в состоянии избежать предупреждения, делая что-то вроде этого:

#define BUFFER_OFFSET(i) ((char*)NULL+(i))
myFunction(BUFFER_OFFSET(3));

предупреждение говорит вам, что ints уже указателей, поэтому вы теряете информацию, когда вы бросаете из указателя на int. Как было предложено выше, используйте uintptr_t. Это целочисленный тип, который имеет ширину указателя. Если вы вынуждены использовать int, то вы SOL. "Универсальный" == сломан.