Почему функция printk() не использует запятую для разделения параметров?
Пример printk
call:
printk(KERN_INFO "Log message.\n");
Возможно, этот вопрос больше связан с C в целом, потому что я никогда не видел функции в C перед этими разделенными параметрами без запятой.
Как это работает? Что делает компилятор с этой информацией? Поскольку уровень log является целым числом, а сообщение является указателем на массив char, он должен передавать их отдельно.
Ответы
Ответ 1
Функция printk()
принимает только один аргумент const char*
. Макрос KERN_INFO
расширяется до "\001" "6"
, получая:
printk("\001" "6" "Log message.\n");
C lexer объединяет смежные строковые литералы, что означает, что
приведенное выше преобразуется в:
printk("\0016Log message.\n");
Ответ 2
Уровень журнала не является целым числом, а строковым литералом. Строковые литералы рядом друг с другом объединяются в один строковый литерал во время компиляции.
Ответ 3
Потому что, если вы просматриваете файлы заголовков, вы увидите, что, например, KERN_INFO
- это макрос, расширенный как строковый литерал (фактически несколько строковых литералов, см., например, связанную перекрестную ссылку), и два строковых литерала рядом друг с другом, которые будут объединены в один строковый литерал компилятором.
Итак, вызов
printk(KERN_INFO "Log message.\n");
не является вызовом функции с несколькими аргументами, это вызов функции с единственным строковым литералом.