Это сделано для того, чтобы функцию можно было вызывать как для обычных переменных, так и для переменных. Нельзя передать переменную volatile в функцию, которая не ожидает аргумента volatile. Следующий код не компилируется (протестировано с компилятором Visual Studio 2005 C ++):
void TestV(int *a)
{
*a = 1;
}
void Test()
{
volatile int a = 0;
TestV(&a);
}
С декларацией можно сделать следующее:
volatile LONG a = 0;
InterlockedIncrement(&a);
Поскольку наиболее вероятно, что имеет смысл вызывать InterlockedIncrement для изменчивых переменных, представляется разумным объявить его таким.