将#defined常数转换为字符串

时间:2012-09-29 00:51:20

标签: c macros c-preprocessor c-strings stringification

我有一个常量定义:

#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”,但我希望有一个更优雅的解决方案。

1 个答案:

答案 0 :(得分:17)

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

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

scanf("%" STRINGIZE(MAX_STR_LEN) "s", p_buf);