Приведение указателя к изменчивой пустоте ** в C++
У меня достаточно приличные навыки C++, но этот актерский состав вызывал у меня проблемы. У меня есть функция, которая принимает следующие параметры: (volatile void **, void * , void*)
, у меня 3 int*
переменные, и я пытаюсь передать их как (&var1, var2, var3)
, Однако я получаю следующую ошибку: Cannot convert parameter 1 from int** to volatile void**
, Есть ли конкретный состав, который нужно сделать, чтобы учесть это? Ниже приведен фрагмент кода, который я использую. Любая помощь с благодарностью.
int* pVal = InterlockedCompareExchangePointer(&cur_val, new_val, old_val);
Это делается в VS2010 на компьютере с Windows XP.
3 ответа
Первый должен быть volatile void **
и у тебя есть int **
, Вы можете либо просто привести к volatile void**
или (лучше) объявить исходную переменную как volatile
а затем снимали.
volatile
означает, что переменная может быть изменена в другом месте за пределами вашего кода, и в основном это означает, что переменная не будет оптимизирована, но поскольку ваша исходная переменная не определена как volatile
он все еще может быть оптимизирован, и вы получите неправильные результаты.
Вы можете сделать const_cast
, но лучшее, что вы можете сделать, это объявить вашу переменную volatile int*
(т.е. указатель на volatile int
) потому что в противном случае результат может быть неопределенным.
InterlockedCompareExchangePointer
выполняет операцию, которая может выходить за рамки оптимизатора для анализа, поэтому важно, чтобы переменная volatile
чтобы убедиться, что его значение выбирается из памяти (а не кэшируется в регистрах и т. д.) при каждом его использовании.
В дополнение к объявлению int как volatile, вам все равно необходимо привести его как:
int* pVal = (int *)InterlockedCompareExchangePointer((void **)&cur_val, (void *)new_val, (void *)old_val);
Обратите внимание на приведение значения, возвращаемого функцией. Возвращает void *, поэтому он должен быть приведен к int *.
C++ требует явного приведения.