GNU C预处理器:对宏评估的结果进行字符串化

时间:2012-06-27 19:29:03

标签: c gcc c-preprocessor stringification

我有一个常见的字符串宏,我希望将其转换为长度值字符串,如果可能的话,都在宏中,所以一切都以.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然后stringify

我可以但不想忘记.rodata并在运行时生成它,例如

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

请注意,这不是已经问过并已经回答的问题here,例如,以及许多其他问题。

1 个答案:

答案 0 :(得分:2)

sizeof由编译器处理,而不是预处理器,因此您无法采用该方法。其他两个选项将起作用,哪一个更适合取决于您的具体情况。