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

我有一个常见的字符串宏,我想转换为长度值字符串,所有这些都在宏中,如果可能的话,所以一切都以.rodata

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

我想将PAYLOAD_LEN用作字符串,作为另一个字符串的一部分,例如

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

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

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

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

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

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