如何扩展& stringify这样的宏?

时间:2014-11-19 02:26:28

标签: c++ c macros

我正在为字符串解析器创建一个包装器,它将字符串转换为基本类型。我正在为它编写单元测试,所以我需要这些原始类型的极值的字符串表示,因此需要对标准宏进行字符串化,例如INT_MIN和INT_MAX。

正常的stringify宏看起来像这样:

#define STRINGIFY(content) #content
#define EXPAND_AND_STRINGIFY(input) STRINGIFY(input)

适用于EXPAND_AND_STRINGIFY(SHRT_MAX),它将扩展为“32767”。

但是,当它与EXPAND_AND_STRINGIFY(SHRT_MIN)一起使用时,它会扩展为“(-32767 -1)”,因为#define SHRT_MIN (-SHRT_MAX - 1)。这不是我想要的。有没有可能的解决方法呢?

1 个答案:

答案 0 :(得分:4)

不,没有办法让预处理器宏评估算术表达式。

您可以让预处理器进行算术计算,但仅限于#if的上下文,它允许您评估布尔表达式。您可以使用该功能而非费力地输出数字,但只能在#include d文件中使用预处理器输入,因为您无法将#if放入宏中。

你没有提及为什么你想要字符串化INT_MIN,所以如果确实存在替代品,我就无法提供替代品。

但是,最有可能的做法是在运行时使用snprintf简单地生成字符串。