Приведение указателя к изменчивой пустоте ** в C ++ - PullRequest
0 голосов
/ 12 декабря 2011

У меня достаточно приличные навыки 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 ]

3 голосов
/ 12 декабря 2011

Первый должен быть volatile void **, а у вас есть int **.Вы можете либо просто привести к volatile void**, либо (лучше) объявить исходную переменную как volatile, а затем привести.

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

1 голос
/ 12 декабря 2011

Вы можете сделать const_cast, но лучшая вещь , которую вы можете сделать, - объявить вашу переменную volatile int* (то есть указатель на volatile int), потому что в противном случае результат может быть неопределенным.

InterlockedCompareExchangePointer выполняет операцию, которая может выходить за рамки оптимизатора для анализа, поэтому важно, чтобы переменная была volatile, чтобы убедиться, что ее значение выбирается из памяти (а не кэшируется в регистрах и т. Д.) Каждыйвремя его использования.

0 голосов
/ 12 декабря 2011

В дополнение к объявлению типа int как volatile, вам все равно необходимо привести его как:

int* pVal = (int *)InterlockedCompareExchangePointer((void **)&cur_val, (void *)new_val, (void *)old_val);

Также обратите внимание на приведение значения, возвращаемого функцией. Возвращает void *, поэтому он должен быть приведен к int *.

C ++ требует явного приведения.

...