Я видел debug printfs в glibc, который внутренне определен как (void) 0
, если определено NDEBUG. Аналогично __noop
для компилятора Visual С++. Первый работает как на компиляторах GCC, так и на VС++, а последний - только на VС++. Теперь мы все знаем, что оба вышеуказанных утверждения будут рассматриваться как никакие операции, и никакой соответствующий код не будет сгенерирован; но здесь, где я сомневаюсь.
В случае __noop
MSDN говорит, что это внутренняя функция, предоставляемая компилятором. Переход к (void) 0
~ Почему он интерпретируется компиляторами как нет op? Является ли это сложным использованием языка C, или стандарт говорит что-то об этом? Или даже это как-то связано с реализацией компилятора?