Фрагмент кода из bits/confname.h
/* Values for the NAME argument to `pathconf' and `fpathconf'. */
enum
{
_PC_LINK_MAX,
#define _PC_LINK_MAX _PC_LINK_MAX
_PC_MAX_CANON,
#define _PC_MAX_CANON _PC_MAX_CANON
_PC_MAX_INPUT,
#define _PC_MAX_INPUT _PC_MAX_INPUT
_PC_NAME_MAX,
#define _PC_NAME_MAX _PC_NAME_MAX
_PC_PATH_MAX,
#define _PC_PATH_MAX _PC_PATH_MAX
_PC_PIPE_BUF,
#define _PC_PIPE_BUF _PC_PIPE_BUF
_PC_CHOWN_RESTRICTED,
#define _PC_CHOWN_RESTRICTED _PC_CHOWN_RESTRICTED
Зачем? В чём скрытый смысл?
И самое интересное, каким образом это должен понять препроцессор?
Ладно, допустим, это такой хитрый трюк. Но как тогда быть с рекурсивным раскрытием таких конструкций? Приведу пример:
#define A "This is A"
#define B A
#define C B
#define D C
puts(D);
Т.е. при обработке исходника препроцессором код выродится в puts(«This is A»); Но при препроцессинге bits/confname.h перечисление ещё не определено. И что происходит в такой ситуации?