为什么printk()函数不使用逗号分隔参数?

时间:2016-07-20 22:41:48

标签: c linux linux-kernel

示例printk致电:

printk(KERN_INFO "Log message.\n");

也许这个问题更多地是关于C的,一般来说,因为在没有逗号的情况下,在分离参数之前我从未见过C中的函数。

这是如何工作的?编译器对这些信息做了什么?由于日志级别是一个整数,并且消息是指向char数组的指针,因此它必须单独传递它们。

3 个答案:

答案 0 :(得分:22)

printk()函数只需要一个const char*参数。 KERN_INFO宏扩展为"\001" "6",产生:

printk("\001" "6" "Log message.\n");

C lexer连接相邻的字符串文字标记,这意味着 以上内容转换为:

printk("\0016Log message.\n");

答案 1 :(得分:7)

日志级别不是整数,而是字符串文字。彼此相邻的字符串文字在编译时连接成一个字符串文字。

答案 2 :(得分:5)

因为如果您搜索标题文件,您会看到例如KERN_INFO是一个扩展为字符串文字的宏(实际上是多个字符串文字,参见例如链接的交叉引用),并且两个字符串文字紧挨着它们将被连接成编译器的单个字符串文字。

所以电话

printk(KERN_INFO "Log message.\n");

不是带有多个参数的函数调用,它是一个带有单个字符串文字参数的函数调用。