【发布时间】:2009-08-16 15:58:15
【问题描述】:
假设有一个简单的测试代码
typedef struct
{
int first;
int second;
int third;
} type_t;
#define ADDRESS 0x12345678
#define REGISTER ((type_t*)ADDRESS)
const int data = (int)(®ISTER->second)*2;
int main(void)
{
volatile int data_copy;
data_copy = data;
while(1) {};
}
在 CodeSourcery G++ (gcc 4.3.2) 中为裸机 ARM 编译。它还有一个非常标准的链接器脚本。
在 C 中编译时(作为 main.c),对象“数据”按预期进入 Flash。当用 C++ 编译时(作为 main.cpp),这个对象进入 RAM,并且添加了额外的代码,这些代码只是将值从 Flash 复制到 RAM(值已经计算,只需复制!)。所以编译器可以计算地址,但不知何故不想“只是 使用它”。问题的根源是地址的乘法 - 没有“* 2”乘法,两个版本都按预期工作 - “数据”被放置在闪存中。此外 - 当“数据”声明为:
const int data = (int)(REGISTER)*2;
一切都很好。
C 和 C++ 编译的所有文件都是相同的,唯一的区别是对编译器的调用 - g++ 用于 main.cpp,gcc 用于 main.c(警告级别不同,c++ 禁用了 RTTI 和异常) .
是否有任何简单而优雅的方法来克服这个“C++ 问题”?我确实需要这样的操作来在 Cortex-M3 的位带区域中创建位地址的 const 数组。这是一个错误,还是 C++ 编译器的一些奇怪限制?
我知道我可以在“C”文件中创建数据对象,而只是“extern”——将它们包含在 C++ 中,但这不是很优雅 [;
感谢大家的帮助!
【问题讨论】:
标签: c++ c embedded arm codesourcery