我有一个常量定义:
#define MAX_STR_LEN 100
我正在尝试这样做:
scanf("%" MAX_STR_LEN "s", p_buf);
但当然这不起作用。
可以使用什么预处理器技巧将MAX_STR_LEN数字转换为字符串,以便在上面的scanf调用中使用它?基本上是:
scanf("%" XYZ(MAX_STR_LEN) "s", p_buf);
XYZ()应该是什么?
注意:我当然可以直接做“%100s”,但这样做会失败。我也可以#define MAX_STR_LEN_STR“100”,但我希望有一个更优雅的解决方案。
答案 0 :(得分:17)
使用#
预处理运算符。此运算符仅在宏扩展期间有效,因此您需要一些宏来帮助。此外,由于宏替换算法固有的特殊性,您需要一层间接。结果如下:
#define STRINGIZE_(x) #x
#define STRINGIZE(x) STRINGIZE_(x)
scanf("%" STRINGIZE(MAX_STR_LEN) "s", p_buf);