Изменения препроцессораСтандарт С99 внес небольшие изменения и в препроцессор. Переменные списки аргументовВозможно, самым важным изменением препроцессора является возможность обрабатывать макросы с переменным количеством аргументов. На переменное количество аргументов указывает многоточие (...), находящееся в определении макроса. Встроенный препроцессорный идентификатор __VA_ARGS__ определяет, куда будут подставляться аргументы. Например, после включения в программу определения #define MyMax(...) max(__VA_ARGS__) выражение MyMax(a, b); преобразуется в max(a, b); До обозначения переменного количества аргументов (...) макрос может иметь другие аргументы. Например, после определения #define compare(compfunc, ...) compfunc(__VA_ARGS__) оператор compare(strcmp, "один", "два"); преобразуется в оператор strcmp("один", "два");
Как видно из примера, встроенный идентификатор __VA_ARGS__ заменяется всеми остальными аргументами. Оператор _PragmaС выходом С99 в языке С появился еще один способ определять прагму в программе: оператор _Pragma. В общем виде этот оператор выглядит таким образом: _Pragma("директива")
Здесь директива — это вызываемая прагма[1]. Появление оператора _Pragma дает прагмам возможность участвовать в макрозамене. Встроенные прагмы
Подробные сведения об этих прагмах должны быть приведены в документации по компилятору. Новые встроенные макросыК макросам, поддерживаемым С89, в С99 добавлены следующие:
|
| |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|