Что такое "..." в коммутаторе в коде 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" не упоминает об этом?
Ответы
Ответ 1
Это расширение gcc
gcc extensions. Похоже, clang также поддерживает это, чтобы попытаться оставаться совместимым с gcc
. Использование флага -pedantic
в gcc
или clang
предупреждает вас о том, что это нестандартное значение, например:
warning: range expressions in switch statements are non-standard [-Wpedantic]
Интересно отметить, что Ядро Linux использует множество расширений gcc, один из расширений, не описанных в статье, является выражением оператора.
Ответ 2
Это gcc-компилятор extension, позволяющий объединить несколько операторов case в одной строке.
Ответ 3
Остерегайтесь, он не является стандартным C и поэтому не переносится. Это краткое изложение для заявлений дела. Он хорошо определен, так как в C вы можете включать только интегральные типы.
В стандарте C, ...
используется только в списках аргументов переменной длины.
Ответ 4
case '0'... '7': диапазон диапазонов Speciacation в gcc.
Спецификация диапазона для оператора case.
Записывать пробелы вокруг..., иначе он может быть проанализирован неправильно, когда вы используете его с целыми значениями
case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1];