使用编译时生成的整数附加字符串文字

时间:2016-04-28 11:34:32

标签: string c++11 gcc

我试图在编译时生成一个包含常量字符串和几个计算整数的字符串。

此字符串将用于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,它解释了如何使用模板元编程将整数转换为字符串,但我仍然无法弄清楚如何追加字符串(同样,在编译期间。)

我很乐意找到解决这个问题的方法。

1 个答案:

答案 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属性通常在嵌入式系统上使用,在这些嵌入式系统中,构建系统已经完成了许多其他工作(生成链接脚本,覆盖等),因此几乎没有动力使其变得更智能。依靠构建系统是您最好的选择。