更多"适当"编写Linux内核模块时:使用static const
定义常量,或#define
?
我有一个与硬件相关的内核模块,我有一个典型的常量,它是缓冲区的数量。而不是硬编码" 3"到处都是,我想用一个常数。 C风格通常建议使用static const
,但我注意到内核到处都是#define
。有原因吗?
答案 0 :(得分:3)
过去你不能这样做:
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
,这是一个非常好的工具,当涉及到不重复整个地方的大小常量时,无论常量如何实现。