Использование адреса в качестве скалярного значения - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь понять какой-то устаревший код, используя AfxBeginThread .

Насколько я понимаю, LPVOID определяется как указатель на пустой объект. У меня есть эта функция:

Start(LPVOID pParam){
...
   int iTemp = (int)pParam;
...
}

А потом звонок:

int ch1 = 1;
AfxBeginThread(Start(), (LPVOID)ch1);

При компиляции для 64-битной системы появляется следующее предупреждение компилятора:

warning C4312: 'type cast': conversion from 'int' to 'LPVOID' of greater size

Я

  • не на 100% уверен, что это правильное использование указателя
  • чтобы избежать предупреждения, я мог бы использовать вспомогательную функцию, такую ​​как (LPVOID) PtrToInt (ch1), но мне это тоже не подходит

Может ли кто-нибудь помочь мне понять механику, стоящую за этим? Я пытался найти в Интернете пример, который использует AfxBeginThread аналогичным образом, но до сих пор не получилось.

MS состояния:

Параметр является единственным значением. Значение, которое функция получает в этом параметре, является значением, которое было передано конструктору при создании объекта потока. Управляющая функция может интерпретировать это значение любым способом, который она выберет. Его можно рассматривать как скалярное значение или указатель на структуру, содержащую несколько параметров, или его можно игнорировать.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Это предупреждение возникает из-за того, что вы компилируете на 64-битной машине, где sizeof(void*) равно 8 байтов, но sizeof(int) равно 4.

Правильный способ справиться с этим - использовать целочисленный тип для ch1, который имеет тот же размер, что и указатель void. Это точный вариант использования для intptr_t.

Итак, будет безопасно, если вы используете ìntptr_t для хранения переменной ch1. См. Также этот вопрос: C ++: Безопасно ли приводить указатель к int, а затем обратно к указателю снова?

0 голосов
/ 31 августа 2018

не на 100% уверен, что это правильное использование указателя

У тебя правильная догадка. Нет, это неправильное использование указателя.

Вы можете передать указатель на функцию.

int ch1 = 1;
int* ptr = &ch1;
AfxBeginThread(Start(), ptr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...