C良好的编程习惯使用#define和十六进制值代替十进制



我正在努力改进我的嵌入式编码实践。下面的代码将值0写入内存位置0x80001000

#define MemoryWrite(A,V) *(volatile unsigned long*)(A)=(V)
#define FLAG 2147487744 //0x80001000
uint32_t reset_value = 0;
int main(void)
{
    MemoryWrite(FLAG, reset_value);
    return 0;
}

我有两个问题:

  1. 为了使用MemoryWrite宏,我必须将0x80001000转换为2147487744。我认为这使得代码不清晰。是否有一种方法,我可以做到这一点,只是使用十六进制值?

  2. 我将reset_value定义为uint32_t。如果我用#define,会有什么变化呢?

    为了使用MemoryWrite宏,我必须将0x80001000转换为2147487744。我认为这是不好的做法,而且不明确。是否有一种方法,我可以做到这一点,只是使用十六进制值?
#define FLAG 0x80001000u

unsignedu不存在时,因为您在32位机器上有4个字节,编译器假设该值为signed and0x80001000 = -2147479552

  • 我不确定是否将reset_value定义为uint32_t是好的做法。我可以这样做作为一个#define
  • 你当然可以写#define RESET_VALUE 0。但在如此简单的代码中,其实用性并不明显。这取决于您将来是否要修改该值。对于这个10行的例子,编译器肯定会以同样的方式优化它。

    你可以这样做,

    #define FLAG 0x80001000ULL
    ...
    MemoryWrite(FLAG, 0);
    

    最新更新