Skip to main content
 首页 » 编程设计

c之在这个特定场景中,内联代码放在哪里

2023年11月22日16langtianya

我正在花时间查看 Linux 内核源代码,发现了一个困惑的来源。在头文件/usr/src/linux-headers-3.2.0-4-common/include/linux/fs.h中存在以下内容;

2183 static inline void unregister_chrdev(unsigned int major, const char *name) 
2184 { 
2185     __unregister_chrdev(major, 0, 256, name); 
2186 } 

除了 /proc/kallsymsModule.symvers 之外,我找不到任何关于 __unregister_chrdev() 的定义。

foo@bar:/usr/src$ cat /proc/kallsyms | grep "__unregister_chrdev$" 
ffffffff810fd400 T __unregister_chrdev 
foo@bar:/usr/src$ 
 
foo@bar:/usr/src$ grep -R '__unregister_chrdev' * 
linux-headers-3.2.0-4-amd64/Module.symvers:0x6bc3fbc0   __unregister_chrdev vmlinux EXPORT_SYMBOL 
linux-headers-3.2.0-4-common/include/linux/fs.h:extern void __unregister_chrdev(unsigned int major, unsigned int baseminor, 
linux-headers-3.2.0-4-common/include/linux/fs.h:    __unregister_chrdev(major, 0, 256, name); 
foo@bar:/usr/src$ 

据我了解,内联函数会将自身的调用替换为函数中定义的内容,但在这种情况下,自身的内容是对新函数的调用。这是否意味着我可以以某种方式直接调用 __unregister_chrdev(major, 0, 256, name) 而无需更改任何重要内容?这里发生了什么?

请您参考如下方法:

内部函数的名称或其原型(prototype)可能会更改。

你应该总是调用外部的。

优化的构建会将其视为宏并有效地调用内部函数。