Как подавить «предупреждение: приведение к указателю из целого числа разного размера»? - PullRequest
1 голос
/ 22 марта 2019

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 почти гарантированы).В этом случае, однако, тип указателя - это просто мой «целочисленный мул», никогда не предназначенный для использования в качестве указателя.

Как я могу подавить предупреждение компилятора для этого конкретного случая?

1 Ответ

0 голосов
/ 22 марта 2019

При выполнении обоих преобразований (int -> void* и void* -> int) сначала выполняется приведение к uintptr_t, а затем к нужному типу:

int ret = 42;
void *marshaled_return = (void *)(uintptr_t)ret;
int unmarshaled_return = (int)(uintptr_t)marshaled_return;
...