我使用基于 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),编译器就无法消除未使用的对象,这样就会浪费大量空间。
有没有更好的方法来做到这一点?