Тот факт, что троичный оператор является выражением, а не оператором, позволяет использовать его в расширениях макросов для функционально-подобных макросов, которые используются как часть выражения. Const, возможно, не был частью оригинального C, но препроцессор макросов уходит в прошлое.
Одно из мест, где я видел его использование, - это пакет массивов, который использовал макросы для доступа к проверенному массиву. Синтаксис для проверенной ссылки был что-то вроде aref(arrayname, type, index)
, где arrayname было фактически указателем на структуру, которая включала границы массива и массив без знака для данных, тип был фактическим типом данных, а индекс был индексом , Расширение этого было довольно сложным (и я не собираюсь делать это по памяти), но для проверки границ использовались некоторые троичные операторы.
Вы не можете сделать это как вызов функции в C из-за необходимости полиморфизма возвращаемого объекта. Таким образом, макрос был необходим для приведения типов в выражении.
В C ++ вы можете сделать это как шаблонный перегруженный вызов функции (возможно, для operator []), но в C таких функций нет.
Edit: Вот пример, о котором я говорил, из пакета Berkeley CAD array (версия 1.4, версия 1.4). Документация по использованию array_fetch:
type
array_fetch(type, array, position)
typeof type;
array_t *array;
int position;
Получить элемент из массива.
ошибка во время выполнения происходит при попытке
ссылка за пределами
массив. Нет проверки типов
что значение в данной позиции
на самом деле того типа, который используется при
разыменование массива.
и вот определение макроса array_fetch (обратите внимание на использование троичного оператора и оператора последовательности запятых для выполнения всех подвыражений с правильными значениями в правильном порядке как часть одного выражения):
#define array_fetch(type, a, i) \
(array_global_index = (i), \
(array_global_index >= (a)->num) ? array_abort((a),1) : 0,\
*((type *) ((a)->space + array_global_index * (a)->obj_size)))
Расширение для array_insert (которое при необходимости увеличивает массив, как вектор C ++) даже более сложное, включая несколько вложенных тернарных операторов.