将#defined常数转换为字符串

Sid*_*tta 5 c macros c-strings stringification c-preprocessor

我有一个常量定义:

#define MAX_STR_LEN 100
Run Code Online (Sandbox Code Playgroud)

我想这样做:

scanf("%" MAX_STR_LEN "s", p_buf);
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用.

可以使用什么预处理器技巧将MAX_STR_LEN数字转换为字符串,以便我可以在上面的scanf调用中使用它?基本上:

scanf("%" XYZ(MAX_STR_LEN) "s", p_buf);
Run Code Online (Sandbox Code Playgroud)

XYZ()应该是什么?

注意:我当然可以直接做"%100s",但这样做会失败.我也可以#define MAX_STR_LEN_STR"100",但我希望有一个更优雅的解决方案.

Jam*_*lis 18

使用#预处理运算符.此运算符仅在宏扩展期间有效,因此您需要一些宏来帮助.此外,由于宏替换算法固有的特殊性,您需要一层间接.结果如下:

#define STRINGIZE_(x) #x
#define STRINGIZE(x) STRINGIZE_(x)

scanf("%" STRINGIZE(MAX_STR_LEN) "s", p_buf);
Run Code Online (Sandbox Code Playgroud)