Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

#define и ##

8.9K
13 августа 2007 года
Kulti
77 / / 29.07.2006
Помогите, пожалуйста, понять, почему так получается:
 
Код:
#define TYPE int

#define FIFO(T) FIFO_##T

typedef struct
{
....
}FIFO( TYPE );

Вопрос: Почему у эту структуру зовут FIFO_TYPE, а не FIFO_int?
12K
13 августа 2007 года
__AleXX__
133 / / 02.04.2007
Скорее всего раскрывается сначала второй дефайн, следовательно после чего первый на конструкцию FIFO_TYPE уже не реагирует как на макрос.

Почему именно второй сначала срабатывает - вопросы к разработчикам компилера :))

А нафига такие хитрые конструкции писать?
Разве в стандарте сказано, что макросы буду раскрываться последовательно?
19K
13 августа 2007 года
Некромант
23 / / 05.12.2006
Первым препроцессор видит FIFO в строке FIFO( TYPE ), подставляет его и сморит. Помните, что препроцессор всего лишь обрабатывает текст программы. Встретил объявленное имя - подставил, и т.д.
8.9K
13 августа 2007 года
Kulti
77 / / 29.07.2006
Спасибо, Некромант! Теперь понял.
Цитата:
А нафига такие хитрые конструкции писать?


Когда пишешь на чистом С, а хочется что-то типа шаблона забубенить. Вот тогда и приходится извращатся. Просто хотелось вместо трех строчек для нового типа одну менять... ну да ладно...

1.8K
13 августа 2007 года
igor_nf
256 / / 13.12.2006
Рассмотрите такой пример:
 
Код:
#define TYPE int
#define c ww
#define a c
#define FIFO( T ) FIFO_##T

typedef struct a
{
int a;
int b;
} FIFO( TYPE );

...и посмотрите на результат препроцессирования. Можете поменять местами второй и третий дефайны - результат тот же.
Автору:
Препроцессор GNU C
Насколько я понял из этой статьи, макрорасширение, использующее конкатенацию лексем, не подвергается дополнительной макроподстановке(поэтому в твоём случае Т не заменяется на int а остаётся TYPE после первого прохода, как и должно быть).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог