Идея состоит в том, чтобы макрос ничего не делал в сборках релиза.Вы можете определить его как пустой строковый литерал, поскольку "";
является допустимым выражением.Я полагаю, что причина определения ((void)0)
заключается в том, что реализация не генерирует предупреждения для выражения.У меня нет оснований говорить это, но некоторые минимальные тесты показывают, что "";
выдает предупреждение, а ((void)0)
- нет.Конечно, предупреждения не стандартизированы, поэтому может существовать конкретная реализация, которая также выдает предупреждение для ((void)0)
, но она должна была бы определить assert
для чего-то другого, что не в NDEBUG
сборках, иначебыть довольно раздражающим для пользователя.