И пример насыщения/раздувания кода при помощи таких "важных" фич, как макросы и пространства имён.
Намедни копался в заголовках... Пример определения типа time_t в time.h:
Код:
#if !defined __time_t_defined && (defined _TIME_H || defined __need_time_t)
# define __time_t_defined 1
# include <bits/types.h>
__BEGIN_NAMESPACE_STD
/* Returned by `time'. */
typedef __time_t time_t;
__END_NAMESPACE_STD
#if defined __USE_POSIX || defined __USE_MISC || defined __USE_SVID
__USING_NAMESPACE_STD(time_t)
#endif
#endif /* time_t not defined and <time.h> or need time_t. */
#undef __need_time_t
Снаружи обвязка для оптимизации, чтобы препроцессору меньше колбасить. Дальше обёртка, засовывающая имя в пространство имён std. Это дело придумали не сразу, поэтому потом при определённых условиях имя высовывается обратно в глобальное пространство имён, для обратной совместимости.
Суть (для 32 бит КП/ББ) в одной строчке интерфейсного модуля LinLibc:
Код:
TYPE time_t = INTEGER;
Ради которой нужно ещё зайти в bits/types.h
Код:
__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */
Потом в bits/typesizes.h
Код:
#define __TIME_T_TYPE __SLONGWORD_TYPE
И снова вернуться в bits/types.h
Код:
#define __SLONGWORD_TYPE long int
Вот так, наверное, и получаются сотни тысяч строк кода.