初始化const与内联函数c

时间:2018-06-08 13:29:33

标签: c macros const inline

我想用宏或函数内联初始化const。

我会尝试

STATIC INLINE uint16_t calcul_checksum_soft_Appli()
{
  uint16_t *l_adresse  = (uint16_t*)0x00001000;
  uint16_t l_checksum = 0;

  for (l_checksum=0;(uint32_t)l_adresse<0x00007FFE;l_adresse+=2)
    l_checksum+=*l_adresse;

l_checksum = ~l_checksum +1;

return (l_checksum);
}
const uint16_t Checksum __attribute__((at(ADR_CHECKSUM))) = calcul_checksum_soft_Appli();

==&gt;在常量表达式中不允许函数调用

或使用define

#define \
calcul_checksum_soft_Appli() \
({ \
uint16_t *l_adresse  = (uint16_t*)0x00001000; \
uint16_t l_checksum = 0;\
for (l_checksum=0;(uint32_t)l_adresse<0x00007FFE;l_adresse+=2) \
    l_checksum+=*l_adresse; \
l_checksum = ~l_checksum +1; \
l_checksum;  \
})

==&gt;期望表达式

我想在我的ROM程序数据中创建校验和。

感谢的。

1 个答案:

答案 0 :(得分:0)

不幸的是,您不能在C中执行此操作 - 它不支持编译时执行代码。充其量你可以编写一个没有循环或语句的宏。如果变量Checksum是本地的,那么函数调用将会起作用。

然而,这是你问题中最不重要的。如果您访问这样的内存,则可能必须通过volatile限定指针来执行此操作。严格地说,你甚至不能对不是数组的东西进行指针运算。所有这些代码都是未定义的行为。

此外,由于隐式整数提升,~l_checksum上的uint16_t将在32位系统上中断。

你应该做的事情是

for(uintptr_t i=START; i<END; i+=2)
{
  uint16_t data = *(volatile uint16_t*)i;
  ...
}