我有一个嵌入式 C 软件,需要多个指向 const 数据的 const 指针。到目前为止,我一直在重复两行代码来初始化它们:
const int data = 0xF0; // const int
const int* const buffer = &data; // const pointer to const int
之前我使用了很多类型转换,但在队友审核时发现太容易出错。如果我能找到一种清晰一致地使用它们的方法,我愿意使用它们。 我还需要避免在传递给函数时丢弃我的
const
限定符,因为丢弃它实际上已经导致了开发中的一个错误。
使用复合文字:
const int * const buffer = (const int []) { 0xF0 };
或:
const int * const buffer = & (const int) { 0xF0 };
您可以在单个声明中定义指针和数据(尽管不可读且不推荐:
const int data = 0xF0, * const buffer = &data;
使用C99复合文字,你还可以写:
const int * const buffer = (const int[]){ 0xF0 };
或
const int * const buffer = (const int[1]){ 0xF0 };
或
const int * const buffer = &(const int){ 0xF0 };
请注意,
const
和 int
关键字的顺序并不重要,将 const
关键字更靠近其限定的 *
可能会更具可读性:
int const * const buffer = (int const []) { 0xF0 };
问题是:为什么需要指针?如果指针是常量,则无法将其更改为指向其他内容,因此当您可以直接传递
&data
时为什么还要定义指针?
删除函数调用的
const
限定符表明存在设计缺陷:采用指向它未修改的数据的指针的函数应将参数定义为 whatevertype const *arg
,并且在传递地址时不需要任何强制转换数据,无论const
合格与否。 如果函数确实修改了它获取的指针所指向的数据,则向其传递定义为 const
的数据将在修改时触发未定义的行为,因为数据可能位于只读存储器中。