Как заставить компилятор не показывать предупреждения 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. "Универсальный" == сломан.