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)
因为如果您搜索头文件,您将看到例如KERN_INFO是一个扩展为字符串文字的宏(实际上是多个字符串文字,请参见例如链接的交叉引用),并且两个字符串文字旁边彼此相似,将连接成编译器的单个字符串文字.
所以电话
printk(KERN_INFO "Log message.\n");
Run Code Online (Sandbox Code Playgroud)
不是带有多个参数的函数调用,它是一个带有单个字符串文字参数的函数调用.