Что такое "..." в switch-case в коде C
Вот кусок кода в /usr/src/linux-3.10.10-1-ARCH/include/linux/printk.h
:
static inline int printk_get_level(const char *buffer)
{
if (buffer[0] == KERN_SOH_ASCII && buffer[1]) {
switch (buffer[1]) {
case '0' ... '7':
case 'd': /* KERN_DEFAULT */
return buffer[1];
}
}
}
Это своего рода оператор? Почему "Язык программирования C" не упоминает об этом?
4 ответа
Это gcc
Расширение называется case case, вот как это объясняется в документе:
Вы можете указать диапазон последовательных значений в одной метке регистра, например так:
case low ... high:
Вы можете найти полный список расширений gcc здесь. Кажется, что Clang также поддерживает это, чтобы попытаться остаться совместимым с gcc
, С использованием -pedantic
флаг в любом gcc
или же clang
предупредит вас, что это нестандартно, например:
warning: range expressions in switch statements are non-standard [-Wpedantic]
Интересно отметить, что ядро Linux использует множество расширений gcc, одно из расширений, не рассматриваемых в статье, - это выражения операторов.
Это расширение компилятора gcc, позволяющее объединить несколько операторов case в одну строку.
Осторожно, это не стандартная версия C и, следовательно, не переносимая. Это стенография, разработанная для описания случаев. Это хорошо определено, так как в C вы можете включать только целочисленные типы.
В стандартном С, ...
используется только в списках аргументов переменной длины.
case '0'...'7': диапазоны регистров Speciacation в gcc.
Спецификация диапазона для описания случая.
Пишите пробелы вокруг..., иначе он может быть неверно проанализирован, если вы используете его с целочисленными значениями
case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1];