Мое личное мнение (!) По этому поводу:
Первый подход - #ifndef NDEBUG
- предпочтительнее.
В начале было cc *.c
.
Затем последовало добавление соответствующих опций.
Затем появились системы сборки, которые выяснили, какие из этих *.c
файлов действительно требовали перекомпиляции, и освободили вас от запоминания, какие соответствующие опции были .
Затем появились более сложные системы сборки, которые могли бы найти подходящие варианты для вас.
Со временем системы сборки стали умнее, и может содержать значительную логику. Тем не менее, я чувствую, что этот интеллект должен оставаться сосредоточенным на их основной функции (см. Выше), и что - в конце концов - cc *.c
все еще должен выполнять свою работу.
Системы сборки устарели или заменены. Следующий парень может даже не знать, какую систему сборки вы выбрали; он все еще должен быть в состоянии сделать из головы ваш проект, не разбираясь и в логике вашей системы сборки.
Установка / проверка NDEBUG
- это C, и любой, кто немного знаком с языком (и <assert.h>
), сразу же узнает, что вы собираетесь там делать.
Выяснение того, почему конкретный исходный файл должен быть включен только в определенный тип сборки, но не в другие, из вашей системы сборки, не так интуитивно понятно и может вообще потеряться, когда кто-то подойдет, выбросит ваш CMakeLists.txt
потому что он любит джем больше и строит это с нуля. Этот человек может в конечном итоге задаться вопросом, почему все эти тесты загромождают его код выпуска и почему вы не достаточно умны, чтобы делать их только для отладки (не осознавая, что сделал в своей системе сборки).