您可以使用‘stringify’和字符串连接.
// Traditional stringify.
#define xstr(s) str(s)
#define str(s) #s
#define ADDR 0x20000000
int var attribute((section(".ARM.__at_" str(ADDR))));
字符串连接就是将两个相邻的字符串常量连接在一起.
‘str(Addr)’转换为"0x20000000",因此您最终得到的字符串是".ARM.__at_0x20000000",我相信这就是您想要的.
对于更新的问题,其中的值是计算的,没有简单的方法来实现这一点在‘C’.从技术上讲,这是可能的,但需要大量的条件句枚举,所以这是不实际的.
例如,#define ADDR (0x20000000 + (1024 * 16))
个,期望产生,
int var attribute((section(".ARM.__at_0x20004000")));
可以同时定义ADDR
和ADDR_fixed
,然后有条件地比较它们是否相等.
#define ADDR (0x20000000 + (1024 * 16))
#define ADDR_Fixed 0x20004000
#if ADDR!=ADDR_Fixed
#error "Miscalculation of ADDR."
#endif
编译过程之外的工具/脚本可以计算值,然后将其作为编译器参数传递,例如-DADDR_Fixed=0x20004000
,这可以用来替换ADDR
定义以满足链接器.通常,您可以添加注释或其他标识符以使解析更容易.或者,如果可以在单个文件中收集;而不是分布在整个源代码中,这方面更容易.Python、Perl、BC等可以在解析后处理数学运算.
关于如何实现此脚本的问题完全超出了原始问题的范围,并且已经有许多关于堆栈溢出的示例,具体取决于所选的语言.