GNU C预处理器:字符串化宏评估的结果(GNU C preprocessor: Stringify

2019-10-16 22:21发布

我有,我想如果可能的话转换成一个长度值的字符串,所有内宏,常见的字符串宏,所以在一切结束了.rodata

#define PAYLOAD "xyz"
#define PAYLOAD_LEN (sizeof(PAYLOAD)-1)

我想用PAYLOAD_LEN,作为字符串,在另一个字符串,例如零件

const char lv_macro[]  = "<preamble>" PAYLOAD_LEN ":" PAYLOAD;
const char lv_wanted[] = "<preamble>3:xyz"`

我怀疑这是不可能的,我应该只定义PAYLOAD_LEN为文字,如#define PAYLOAD_LEN 3 ,然后字符串化 。

我可以,但不想,忘记.rodata并在运行时产生的,如

char lv[64];
snprintf(lv, sizeof lv, "<preamble>%zu:" PAYLOAD, PAYLOAD_LEN);

请注意,这是不是已经提出和回答已经问题在这里 ,例如,在许多其他问题。

Answer 1:

sizeof是由编译器,不预处理器处理的,所以你不能采取这种做法。 其他两个选项将工作,哪一个更适合要看您的具体情况。



文章来源: GNU C preprocessor: Stringify the result of a macro evaluation