Почему функция 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");

не является вызовом функции с несколькими аргументами, это вызов функции с единственным строковым литералом.