Я видел отладочную печать в glibc, которая внутренне определена как (void) 0
, если Определяется NDEBUG. Точно так же есть и __noop
для Visual C++. Первый работает как на компиляторах GCC, так и на VC++, а последний - только на VC++. Теперь мы все знаем, что оба вышеуказанных утверждения будут рассматриваться как никакие операции, и никакой соответствующий код не будет сгенерирован; но вот где я сомневаюсь.Почему (void) 0 a нет операции в C и C++?
В случае __noop
MSDN говорит, что это встроенная функция, предоставляемая компилятором. Приходит к (void) 0
~ Почему это интерпретируется компиляторами как нет op? Является ли это сложным использованием языка C, или стандарт говорит что-то об этом? Или даже это связано с реализацией компилятора?
Просто указывая '0;' как оператор, я не получаю предупреждений или ошибок, и я уверен, что он не будет выполнять какую-либо эффективную операцию и будет равен no op; Даже если это так, зачем вводить его в пустоту? Кроме того, в случае '#define dbgprintf (void) 0', когда он вызывается как' dbgprintf («Hello World!»); '->' (void) 0 («Hello World!»); '- что делает это значит? – legends2k
это, вероятно, должно быть '#define dbgprintf (x) (void) 0;' хотя я нашел '#define dbgprintf (x)' вполне достаточным. Я думаю, что приведение к пустоте - это удаление любого возвращаемого значения, поэтому, если оно используется в контексте, которое требует значения (и не должно), оно приведет к ошибке/предупреждению, а не к молчанию. –
Да, я не заметил, что #define игнорирует параметр (x) и просто выполняет '(void) 0'. Спасибо, что указали это :) – legends2k