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

elB*_*ord 15 c linux linux-kernel

一个示例printk电话:

printk(KERN_INFO "Log message.\n");
Run Code Online (Sandbox Code Playgroud)

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

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

PSk*_*cik 22

printk()函数只接受一个const char*参数.该KERN_INFO宏展开"\001" "6",得到以下特性:

printk("\001" "6" "Log message.\n");
Run Code Online (Sandbox Code Playgroud)

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

printk("\0016Log message.\n");
Run Code Online (Sandbox Code Playgroud)


a3f*_*a3f 7

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


Som*_*ude 5

因为如果您搜索头文件,您将看到例如KERN_INFO是一个扩展为字符串文字的宏(实际上是多个字符串文字,请参见例如链接的交叉引用),并且两个字符串文字旁边彼此相似,将连接成编译器的单个字符串文字.

所以电话

printk(KERN_INFO "Log message.\n");
Run Code Online (Sandbox Code Playgroud)

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