c - Linux 内核定义无处不在

标签 c linux-kernel

在linux的内核中,我们可以在linux/sched.h中找到这段代码,当我看到它时,我心中产生了一些疑问:

  1. 为什么使用define来创建函数?为什么不使用普通的return-type function-name(par1, par2) {}样式?
  2. do {} while(0) 有什么意义?

    #define set_special_state(state_value)  
        do {  
            unsigned long flags;  
            raw_spin_lock_irqsave(&current->pi_lock, flags);  
            current->state = (state_value);  
            raw_spin_unlock_irqrestore(&current->pi_lock, flags);  
        } while (0)  
    #endif  
    

最佳答案

这不是一个“函数”,而是一个预处理器宏。

  1. 有时必须使用宏来完成 C 语言本身不支持的事情(通常是生成代码)。但这看起来不像是其中一种情况,并且可能应该是一个静态内联函数。 Pergaps Git 历史可以解释为什么它是这样的。

  2. do { ... } while (0) 是一种吞掉分号的常用方法,该方法在调用类似 C 函数的宏之后调用。

关于c - Linux 内核定义无处不在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51757034/

相关文章:

c - 编写返回两个数组交集的函数的困难

C:字符串到毫秒时间戳

c -/net/ipmr.c中的MFC_HASH

c - 新 Linux 内核中的内存隔离,或者什么?

c - 使用 C 中的函数打开套接字

c - GIO网络传输丢失数据

c - 关于 C 中的指针基础知识

c - C语言中如何使用管道连接两个子进程

windows - OS线程调度与cpu使用关系

linux - 多个驱动程序可以注册来处理Linux中的同一个设备吗