强制编译时计算C函数?

强制编译时计算C函数?,c,gcc,constants,compiler-optimization,C,Gcc,Constants,Compiler Optimization,在我的微控制器项目中,我有一个更新CRC的功能(来自avr libc)。 我正在实现的协议计算一个数据包的校验和,包括它的初始同步字节,我想将同步字节的CRC值作为编译时常量,但我不想手动预计算它 有没有办法强制编译器(GCC 4.3.3)在编译时计算该值,并且只执行一条加载常量指令 库中的函数只包含内联汇编程序,因此我尝试在参数为常量时使用C实现(使用\uuuuu内置常量\up()确定)。代码只是正常编译。 CRC函数不太复杂,只包含一个迭代次数恒定的for循环、一个分支和一些按位操作 要明确

在我的微控制器项目中,我有一个更新CRC的功能(来自avr libc)。 我正在实现的协议计算一个数据包的校验和,包括它的初始同步字节,我想将同步字节的CRC值作为编译时常量,但我不想手动预计算它

有没有办法强制编译器(GCC 4.3.3)在编译时计算该值,并且只执行一条加载常量指令

库中的函数只包含内联汇编程序,因此我尝试在参数为常量时使用C实现(使用
\uuuuu内置常量\up()
确定)。代码只是正常编译。 CRC函数不太复杂,只包含一个迭代次数恒定的for循环、一个分支和一些按位操作


要明确的是,保存这八条汇编指令绝对不是关键,但找到某种解决方案将是给我的OCD的一份不错的圣诞礼物:-)

有办法,但你必须升级到C++11


新的说明符正是您所看到的。但是对于sad,它是。

如果我在你的问题
静态内联
中声明了超链接后面的函数,那么
gcc-O3
将已知参数对函数的调用编译为一条指令:

~ $ cat t.c
#include <stdint.h>

static inline uint8_t
 _crc_ibutton_update(uint8_t crc, uint8_t data)
{
  uint8_t i;

  crc = crc ^ data;
  for (i = 0; i < 8; i++)
    {
      if (crc & 0x01)
    crc = (crc >> 1) ^ 0x8C;
      else
    crc >>= 1;
    }

  return crc;
}

int x;

int main()
{
  x = _crc_ibutton_update(17, 42);
}
~ $ gcc -O2 -S t.c
~ $ cat t.s
...
    movq    _x@GOTPCREL(%rip), %rax
    movl    $158, (%rax)
    popq    %rbp
    ret
...
~$cat t.c
#包括
静态内联uint8\u t
_crc_ibutton_更新(uint8_t crc,uint8_t数据)
{
uint8_t i;
crc=crc^数据;
对于(i=0;i<8;i++)
{
如果(crc&0x01)
crc=(crc>>1)^0x8C;
其他的
crc>>=1;
}
返回crc;
}
int x;
int main()
{
x=crc更新(17,42);
}
约$gcc-O2-S t.c
约$cat t.s
...
莫沃_x@GOTPCREL(%rip),%rax
movl$158,(%rax)
popq%rbp
ret
...

这适用于“gcc版本4.2.1(基于Apple Inc.build 5658)(LLVM build 2336.11.00)”,也适用于“gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5.1)”(然后需要
-O3
)另一个原因是为什么C++和嵌入式编程比敌人更友好。你做了C编写的函数吗?<代码>静态内联< /代码>?“C函数的强制编译时间评估”?我是这样做的:<代码> GCC-O3-C Fo.C./COD>他没有要求C++。