TL; DR:
Мне нужно сделать следующее в моем коде (очень упрощенный пример):
int ret = 42;
void * marshaled_ret = (void *) ret;
int unmarshaled_ret = (int) marshaled_ret;
Это приводит к предупреждению компилятора:
предупреждение: приведение к указателю из целого числа разного размера [-Wint-to-pointer-cast]
Как можно отменить предупреждение компилятора для этогоконкретное происшествие?
Справочная информация: я пишу слой абстракции вокруг библиотек многопоточности для конкретной платформы.
Одна большая проблема заключается в том, что библиотеки ожидают разные сигнатуры для основного потокафункция.POSIX имеет
(void *)(*thread_main)(void *)
, в то время как Windows (фактически) имеет
int (*thread_main)(void *)
, т. Е. Отличается только тип возвращаемого значения.
Поскольку мне нужна одна подпись функции для всех платформЯ выбрал int
как наиболее ограниченный тип возвращаемого значения.При создании потока я помещаю предоставленную пользователем функцию и ее параметр в struct
и вызываю функцию-оболочку (которая имеет подпись, ожидаемую платформой), которая затем вызывает фактическую основную функцию.
Однако в POSIX это включает приведение int
к void *
и обратно, как показано выше, что приводит к предупреждению компилятора.
Очевидно, приведение int
к указателю таким образом являетсяплохая идея, если вы используете его как указатель (segfaults почти гарантированы).В этом случае, однако, тип указателя - это просто мой «целочисленный мул», никогда не предназначенный для использования в качестве указателя.
Как я могу подавить предупреждение компилятора для этого конкретного случая?