编译时的C数组对齐检查

时间:2016-05-16 05:39:57

标签: c gcc arm embedded

我正在尝试在编译时检查8的数组对齐方式。这是代码:

// File scope
uint32_t pool[1024];
bool aligned = (((uintptr_t) pool) % 8) == 0;

我收到此错误:初始化元素在加载时无法计算。但是,当我检查4的数组对齐时,我没有得到错误。以下代码:

// File scope
uint32_t pool[1024];
bool aligned = (((uintptr_t) pool) % 4) == 0;

语言:C

工具链:arm-none-eabi-gcc

编译器选项:-mcpu = cortex-m3 -mthumb

为什么会这样?

2 个答案:

答案 0 :(得分:5)

如果您需要强制执行特定的对齐,则报告这适用于“arm-none-eabi-gcc”工具链:

uint32_t pool[1024] __attribute__((aligned(8)));

答案 1 :(得分:3)

静态变量的地址在 compile 时间是不知道的,它仅在后来由链接器决定。对于以某个任意数字为模的符号的地址,没有合适的重定位"编译器可以发出作为链接器修复的初始化值,因此它放弃了。正如汤姆在评论中所说,可以至少假设链接器不会违反该类型所需的最小对齐,因此能够在这种情况下优化表达式。

我认为你可以实现这一目标的唯一方法就是将其声明为extern bool aligned,然后使用一些链接描述黑魔法在链接时用适当的值定义它。