Глава 4. Препроцессор__________________________________89

Набравшись некоторого опыта, программисты приходят к идее управления отладочным кодом посредством условных директив. Окаймляя его директивами типа

#ifdef DEBUG

// Здесь находится отладочный код ftendif

можно легко заставить препроцессор включать, когда надо, отладочный код в текст программы, а когда надо — игнорировать; и все это простым изменением состояния (определено — не определено) соответствующего символического имени, DEBUG в данном случае. Насколько быстро будет достигнут этот уровень понимания, зависит от конкретного индивидуума. Если вы самоучка, предпочитающий метод проб и ошибок, то это может потребовать изрядного количества времени. Но, уважаемый читатель, очень скоро вам будет указан еще более оптимальный путь, и ваше мастерство будет неуклонно расти по мере чтения этой книги.

Указанный только что способ, хотя и лучше двух предыдущих, все же имеет свой недостаток: написанный таким образом текст выглядит очень коряво. Если вы собираетесь добросовестно протестировать каждый цикл, каждую ветвь условных выражений и тому подобное, то ваша программа будет просто погребена под ворохом, директив DEBUG. Отладка — вещь совершенно необходимая, но подобная тактика обременит ваш код массой лишних строк и сделает его очень запутанным. Более изящная техника продемонстрирована ниже в разделе "Методы написания аккуратного отладочного кода".

Управление заголовками

В файлах заголовков принято размещать интерфейсные части модулей — те детали, которые должны быть доступны другим модулям. Здесь могут быть объявления функций, классов и другие элементы. Это всего лишь общепринятая практика, но если вы непременно хотите быть оригинальным, то, как и в жизни, последствия могут быть достаточно серьезными.

Хотя объявления и определения могут располагаться поблизости друг от друга, объявления — применительно к функциям они еще называются интерфейсами — должны предшествовать определениям, и те и другие должны быть сделаны до первого использования функции (здесь автор явно увлекся — определения совсем не обязаны предшествовать появлению функции в программе, — прим. перев.). Выполнение этого требования обязательно, чтобы дать компилятору возможность произвести проверку типов. Отсутствие объявлений типов данных, функций или переменных до их первого использования вызовет ошибку компиляции. Убедитесь, что заголовки, в которые вы помещаете объявления, включены директивой #include во все модули, в которых есть ссылки на объявляемые имена — в первую очередь приходят на ум файлы с соответствующими определениями.