1

我使用基于 gcc 4.7.2 的 CodeSourcery g++ lite 为 MCU 编程
我想定义位于特定地址的外围对象。所以我尝试将引用与 constexpr 说明符一起使用。

例如:

typedef int& int_ref;
constexpr int_ref i = *(int*)0;

如果我将该代码放入标题中并编译我的程序,我将得到如下诊断:

xx1.o:(.rodata.i+0x0): multiple definition of `i'
...
xxx.o:(.rodata.i+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

它让我感到困惑constexpr int i = 5,因为编译器的运行非常愉快。

当然还有其他解决方案:
1. 宏, #define i *(int*)0,它会污染每个 .c/.cpp 文件,包括标题。目前,我正在使用宏。
2.静态对象,static constexpr int_ref i = *(int*)0;。如果没有一些编译器选项(-fdata-sections),编译器就无法消除未使用的对象,这样就会浪费大量空间。

有没有更好的方法来做到这一点?

4

0 回答 0