2016-07-21 3 views
1

Я просматриваю некоторый код, относящийся к планированию с QueryPerformanceFrequency. Я не могу понять, что здесь происходит. Почему rvalue завернута в круглые скобки? LARGE_INTEGER - это структура, поэтому для инициализации потребуется {} вместо этого, но полностью путается этой строкой. QueryPerformanceFrequency возвращает также bool.Не могу понять эту строку LARGE_INTEGER

// Initialize the resolution of the timer 
LARGE_INTEGER Timer::m_freq = (QueryPerformanceFrequency(&Timer::m_freq), Timer::m_freq); 

Заголовок содержит таймер-структуру с собственным членом:

static LARGE_INTEGER m_freq; 
+1

Это оператор запятой. Это также плохо подвергается насилию. –

+2

Ничего себе. Инициализация переменной, которая будет равна самой себе. Интересно, это даже законно? –

+0

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

ответ

1

Это плохо. Просто плохо, как говорили комментаторы.

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

Сделайте это вместо этого.

  1. Удалить объявление static из переменной m_freq в декларации класса.

  2. Инициализировать m_freq в конструкторе вашего Timer класса.

Пример:

Timer::Timer() 
{ 
    BOOL result = QueryPerformanceFrequency(&m_freq); 

    if (result==FALSE) 
    { 
     // optional - set error condition. But it's not like 
     // the original code was handling the potential error either 
    } 
} 
Смежные вопросы