#define TYPE int
#define FIFO(T) FIFO_##T
typedef struct
{
....
}FIFO( TYPE );
#define и ##
Код:
Вопрос: Почему у эту структуру зовут FIFO_TYPE, а не FIFO_int?
Почему именно второй сначала срабатывает - вопросы к разработчикам компилера :))
А нафига такие хитрые конструкции писать?
Разве в стандарте сказано, что макросы буду раскрываться последовательно?
Первым препроцессор видит FIFO в строке FIFO( TYPE ), подставляет его и сморит. Помните, что препроцессор всего лишь обрабатывает текст программы. Встретил объявленное имя - подставил, и т.д.
Цитата:
А нафига такие хитрые конструкции писать?
Когда пишешь на чистом С, а хочется что-то типа шаблона забубенить. Вот тогда и приходится извращатся. Просто хотелось вместо трех строчек для нового типа одну менять... ну да ладно...
Код:
#define TYPE int
#define c ww
#define a c
#define FIFO( T ) FIFO_##T
typedef struct a
{
int a;
int b;
} FIFO( TYPE );
#define c ww
#define a c
#define FIFO( T ) FIFO_##T
typedef struct a
{
int a;
int b;
} FIFO( TYPE );
...и посмотрите на результат препроцессирования. Можете поменять местами второй и третий дефайны - результат тот же.
Автору:
Препроцессор GNU C
Насколько я понял из этой статьи, макрорасширение, использующее конкатенацию лексем, не подвергается дополнительной макроподстановке(поэтому в твоём случае Т не заменяется на int а остаётся TYPE после первого прохода, как и должно быть).