【发布时间】:2019-03-09 19:31:23
【问题描述】:
这可能是 C 编程中一个非常简单且核心的组件,但很难找到
内核中的printk 可以采用许多日志级别的常量,并且函数本身使用可变参数,但是我不知道它为什么起作用。这是给不熟悉的人的示例调用
printk(KERN_DEBUG "this is my message which can be %s as normal", "formatted");
源代码如下,它使用可变参数,但是什么机制允许将多个以空格分隔的字符串传递给一个参数?
asmlinkage __visible int printk(const char *fmt, ...)
{
va_list args;
int r;
va_start(args, fmt);
r = vprintk_func(fmt, args);
va_end(args);
return r;
}
这不是 printk 特有的,我在创建设备时看到它在内核的驱动程序中使用
device_create(drv_class,
NULL,
dev,
NULL,
MY_DEVICE_NAME "%d", i);
谁能告诉我是什么允许这样做?它是特定于编译器的还是语言的核心部分?
【问题讨论】: