Linux内核:静态常量vs #Define
编写一个linux内核模块时,哪一个更“适合”:使用static const
来定义一个常量,还是#define
?
我有一个与硬件相关的内核模块,我有一个典型的常量,就是缓冲区的数量。 我不想在任何地方硬编码“3”,我想使用常量。 C风格通常建议采用static const
,但我注意到Kernel充满了#define
的各处。 有理由吗?
它曾经是你无法做到的:
const size_t buffer_size = 1024;
unsigned char buffer[buffer_size];
在C中,因为buffer_size
不是一个“真正的”常量。 所以你经常看到
#define BUFFER_SIZE 1024
unsigned char buffer[BUFFER_SIZE];
代替。
从C99开始,你可以做前者,但不能在全球范围内使用。 它不会在函数之外工作(即使static
也不行)。 由于内核中的许多代码处理类似的构造,这可能是使用预处理器的原因之一。
注意:不要忘记sizeof
,这是一个非常好的工具,当涉及到不重复整个地方的大小常量时,无论常量是如何实现的。