假设有一个简单的测试代码
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++ 中,但这不是很优雅 [;
谢谢大家的帮助!