Что такое хороший справочник, документирующий шаблоны использования файлов ".h" в C?

"Интерфейсы и реализации C" демонстрируют некоторые интересные шаблоны использования для структур данных, но я уверен, что есть и другие.

http://www.amazon.com/Interfaces-Implementations-Techniques-Addison-Wesley-Professional/dp/0201498413

3 ответа

Решение

Посмотрите на стандарт кодирования C Центра космических полетов им. Годдарда ( НАС). У него есть хорошие и интересные рекомендации.

Одно конкретное правило, которое я принял для своего собственного кода, заключается в том, что заголовки должны быть автономными. То есть вы должны быть в состоянии написать:

#include "header.h"

и код должен компилироваться правильно, с любыми другими необходимыми заголовками, независимо от того, что было раньше. Простой способ убедиться в этом - включить заголовок в источник реализации - в качестве первого заголовка. Если это компилируется, заголовок является автономным. Если он не компилируется, исправьте все так, как он работает. Конечно, это также требует от вас обеспечения того, чтобы заголовки были идемпотентными - работайте одинаково, независимо от того, как часто они включены. Для этого тоже есть стандартная идиома:

#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...operational body of header.h...
#endif /* HEADER_H_INCLUDED */

Конечно, обязательно, чтобы #define находился вверху файла, а не внизу. В противном случае, если заголовок, включенный этим, также включает header.h, то вы получите бесконечный цикл - не в порядке. Даже если вы решили использовать стратегию:

#ifndef HEADER_H_INCLUDED
#include "header.h"
#endif /* HEADER_H_INCLUDED */

в коде, который включает заголовок - практика, которая не рекомендуется - важно также включить охранники в сам заголовок.


Обновление 2011-05-01

URL-адрес GSFC выше больше не работает. Вы можете найти более подробную информацию в ответах на вопрос " Должен ли я использовать #include в заголовках", который также содержит перекрестную ссылку на этот вопрос.

Обновление 2012-03-24

Ссылочный стандарт кодирования NASA C доступен и загружен через интернет-архив:

http://web.archive.org/web/20090412090730/http://software.gsfc.nasa.gov/assetsbytype.cfm?TypeAsset=Standard

Возможно, вы захотите взглянуть на крупномасштабный дизайн программного обеспечения C++ Джона Лакоса.

Makeheaders - интересный подход: используйте инструмент для генерации заголовков. Makeheaders используется в cvstrac и окаменелости DR Hipp's.

Другие вопросы по тегам