бросать перечисление через пустоту * - PullRequest
2 голосов
/ 14 июля 2011

Я пытаюсь преобразовать старый 32-битный код в 64-битный. Одно из самых частых предупреждений, которое я получаю:

предупреждение: приведение указателя к целому числу другого размера

это происходит, когда функция вызывает pthread_create , которая принимает void * для передачи данных в новый поток. Вызывающий поток помещает в этот void * перечисление (отсюда и несоответствие размера в 64-битном) Вот код:

typedef enum {
zero,
one,
two
}numbers_e;

some_function(...)
{
    numbers_e mydata=zero;

    ...
    pthread_create(..., (void *)mydata);
    ...
}

Мне удалось преодолеть предупреждение с помощью этого:

pthread_create(..., (void *)0 + my_data);

это решение очень уродливо (и я размышляю, лучше ли оставить предупреждение как есть с большим замечанием рядом с кодом, использующим его). Есть ли другое решение?

Ответы [ 3 ]

3 голосов
/ 14 июля 2011

ваше решение не только некрасиво, это - неопределенное поведение (UB), которое может вызвать у вас проблемы в будущем:

  • арифметика на void* указателях не является стандартной и должна быть расширение вашего компилятора
  • арифметика указателя, которая не указывает на действительный объект, равна UB

Чтобы избежать первого, вы можете использовать (char*)0 + my_data, но это все равно оставит вас со вторым.

Что вы могли бы сделать

  • приведите ваше значение к uintptr_t. это тип, который гарантированно быть совместимым с void*, если он существует. Существует на большинстве современных платформ. Преимущество заключается в том, что ваш код не будет компилироваться на платформы, где его нет, четкое указание на то, что чтобы что-то изменить, тогда.
  • использовать указатель на данные. это реальное решение, способ pthreads предназначены

Для того и другого вам придется изменить источник вызываемой функции, так что вы должны поменять его на второй способ, каким он должен быть.

1 голос
/ 14 июля 2011

Да, передайте адрес объекта.

pthread_create(..., (void *)&mydata);

Это должно быть безопасно редактировать , пока mydata остается где-то доступным.

0 голосов
/ 14 июля 2011

Передача данных в виде указателя вряд ли хорошая идея, но если есть много кода, который делает это - просто оставьте это как есть. в противном случае я бы передал адрес, как предложил cnicutar. имейте в виду, что если область mydata заканчивается до начала потока, у вас может быть проблема с повреждением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...