В частности, я хочу написать макрос, который
1) позволяет установить точку останова
2) больше ничего не делает
3) не вызывает предупреждений компилятора
#define NO_OP ((void)0)
void main()
{
bool b = true;
if (b)
NO_OP; // I try to set a breakpoint here, but
} // it jumps to here (in Visual Studio 2010)
Я также пробовал
#define NO_OP (assert(1)) // doesn't work
#define NO_OP (sizeof(int)) // doesn't work
#define NO_OP __asm{} // doesn't work
#define NO_OP do {(void)0;} while(0) // warning: conditional is constant
Единственное, что работает до сих пор, - это достойный сенсации
#define NO_OP { int x = 0; x = x; }
Должен быть лучший способ.
ИЗМЕНИТЬ
Спасибо Blorgbeard, __asm {nop} действительно работает. Но я просто понял, что что-либо с фигурными скобками менее совершенное (проблематично?), Потому что оно оставляет после себя бесполезную полуколону. (Позже) Я не знаю приседания об ассемблере, но я попытался снять фигурные скобки и вуаля! Там ответ: __asm nop
Спасибо!
ДЛЯ ТЕЧЕНИЯ
Вот несколько менее абсурдный пример:
string token = GetNextToken();
if (!Ignore(token))
{
// process token
DoThis(token);
DoThat(token);
}
Этот код завершен - пока программа работает правильно, я не хочу ничего знать о игнорируемых токенах. Но в любой момент времени (и без изменения кода) я хочу убедиться, что я не отказываюсь от хороших токенов
string token = GetNextToken();
if (Ignore(token))
{
NO_OP; // set breakpoint here to monitor ignored tokens
}
else
{
// process token
DoThis(token);
DoThat(token);
}