我有一个问题:我想使用库 complex
的函数 abs
。
但是,我遇到一个错误,警告我使用的函数 abs
是 #define abs(x) (x > 0) ? x : -(x)
.
因此,我认为问题出在我的导入上。由于我还包括 stdio 和 stdlib 库,编译器可能会使用在这些库之一中定义的函数 abs
。
所以我的问题是:如何在不删除任何导入的情况下使用库 complex
的函数 abs
?
非常感谢您的回复。
最佳答案
用括号包裹它。
(abs)(whatever);
这将强制编译器使用函数版本,因为宏不再匹配。
类似函数的宏通过匹配一个标识符后跟一个左括号 (
来工作。因为我们已经将函数名称本身包装在括号中,所以我们有一个标识符后跟一个右括号 >)
,无法匹配宏。括号在语义上是透明的,但它们抑制了宏语法。
IIRC,是 splint
教我这个的 C 检查器。在编写 postscript 解释器时,我创建了漂亮的短宏来访问堆栈。
#define push(o) (*tos++ = (o))
#define pop() (*--tos)
在涉及 tos
的表达式的棘手部分出现之前,它们一直很棒。为了避免未定义的行为,我不得不创建函数版本并将它们用于那些棘手的地方。对于新设计,我完全跳过了宏。
编辑:我有一种挥之不去的感觉,我实际上是在 Coelocanthe 书(Peter Van Der Linden 的 Deep C Secrets)中了解到这一点的,上述情况是我第一次需要它。 IIRC 他的示例涉及 putchar
或 getchar
,它们通常在符合 C 的实现中作为函数和宏实现。
关于c++ - 使用特定库的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16208422/