C语言宏无法正确扩展

问题描述 投票:0回答:1

我用C语言写了如下宏:

#define STR(x) #x

我期望下面的调用会产生结果“11”:

STR(5+6)

但它实际产生的结果是“5+6”

如何编写宏来达到我想要的结果?可以用C或者C++语言实现吗?

谢谢大家!

c++ c macros
1个回答
0
投票

宏是由 C 预处理器完成的文本替换;一个在编译器本身看到代码之前运行代码的工具,因此,在评估任何编译时常量表达式(例如 5+6)之前。

最重要的是,预处理器不知道您正在编写的语言。它不知道 C 或 C++ 的任何语法或语义。

这就是为什么在 C++ 世界中,宏通常被认为是“邪恶的”(阅读:除非绝对必要,否则应该避免)。 请注意,您想要的结果(将编译时求值的数字解析为编译时求值的字符串)即使在最新的 C++ 标准修订版中也通常无法实现。

constexpr
字符串确实存在,但它们不会长期存在:请参阅 Is it possible to use std::string in a Constant Expression?

底线:无法完成,必须在运行时完成。

© www.soinside.com 2019 - 2024. All rights reserved.