首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中使用位移位但不使用加法或减法时出现"error: initializer element is not constant“

在C++中使用位移位但不使用加法或减法时出现"error: initializer element is not constant“
EN

Stack Overflow用户
提问于 2018-06-09 10:32:00
回答 1查看 519关注 0票数 0

我的嵌入式系统有两个内存区域。我创建了在这些区域之间切换的宏。我希望能够在编译时执行这些宏,但我为某些操作获取了error: initializer element is not constant,而不是其他操作。我已经把这个例子总结成这样。以下是全局变量:

__attribute__((section(".vmem_constant.data"))) unsigned int buf0[1024];
unsigned int buf_word_ptr = ((unsigned int)buf0)>>2; // doesn't work
unsigned int buf_word_ptr2 = ((unsigned int)buf0)/4; // doesn't work
unsigned int buf_word_ptr3 = ((((unsigned int)x)-0x40000)>>2); // original problem doesn't work
unsigned int works_1 = ((unsigned int)buf0) + 2; // works
unsigned int works_2 = buf0 + 16; // works

看起来我不能做除法或移位,但是加法或减法都可以。

我最初在尝试减去一个固定的偏移量,然后除以4的时候遇到了这个问题,也许有一种更简单的方法可以做到这一点?我正在使用(GCC) 7.2.0

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 08:39:41

就纯C语言而言,不能在算术常量表达式中使用与地址相关的值。您可以在整数的初始化器中使用(unsigned int) buf0这一事实是编译器特定的扩展。

在此扩展中,对地址常量施加的限制通常仍然适用。这些限制根植于真实加载器的功能。通常情况下,buf0的特定地址并不是真正的编译时常量。只有在加载时才知道它的实际值。加载器将不得不对依赖于此地址的“常量表达式”执行最后一分钟的更新。加载器的算术能力是相当有限的。加载器知道如何进行加法和减法,但仅此而已。因此,您可以在地址常量表达式(以及最终归结为地址加法或减法的其他运算符)中使用加法和减法,但不能使用其他运算符。装载机不能倒班。

此外,您的编译器甚至在这些初始化器中接受(unsigned int) buf0的事实纯属巧合。显然,在您的平台上,指针大小与unsigned int的大小相同。如果不是这样,从指针到unsigned int的转换将不得不截断或扩展该值。加载器也不能做到这一点,这意味着如果不是因为这种巧合,你所有的声明都将无法编译。这就是为什么当您想要将指针转换为整数时,一个更好的想法是使用uintptr_t而不是unsigned int

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50770414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档