我试图在编译时生成一个包含常量字符串和几个计算整数的字符串。
此字符串将用于GCC的__attribute__((section("")))
指令。
整个过程的目的是在ELF文件中放入一些变量,每个变量都有一个唯一的部分名称。
我过去通过使用-DSOME_SYMBOL=<file_source_CRC>
编译每个目标文件来区分目标文件,以及__COUNTER__
来区分单个目标文件中的变量。 (我们使用这个是因为我们的日志记录解决方案的要求)
所以生成的代码将使用类似的东西:
#define SOME_MACRO(msg) {\
static const char *messageBuffer __section__((section(".msg" ## #SOME_SYMBOL ## #__COUNTER__))) = {msg};\
} // Approximation
SOME_MACRO("This is a string");
这个解决方案效果很好,但它需要构建系统的支持(计算CRC并将其作为GCC -D
标志注入),当我们从Makefile移动到SCons时,它变得有点开销
所以我搜索了另一个解决方案,并找到了这个compile time CRC solution,但在尝试找出如何将其附加到字符串时,我有点迷失。
经过一番搜索后,我找到了following answer,它解释了如何使用模板元编程将整数转换为字符串,但我仍然无法弄清楚如何追加字符串(同样,在编译期间。)
我很乐意找到解决这个问题的方法。
答案 0 :(得分:1)
不幸的是,这是不可能的-根据c-attribs.c中的代码,GCC要求section
的操作数是字符串文字:
if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
{
error ("section attribute argument not a string constant");
goto fail;
}
Section属性通常在嵌入式系统上使用,在这些嵌入式系统中,构建系统已经完成了许多其他工作(生成链接脚本,覆盖等),因此几乎没有动力使其变得更智能。依靠构建系统是您最好的选择。