c++ - 使用特定库的函数

标签 c++ c

我有一个问题:我想使用库 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 他的示例涉及 putchargetchar,它们通常在符合 C 的实现中作为函数和宏实现。

关于c++ - 使用特定库的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16208422/

相关文章:

c++ - VSCode 调试 C++ : Why does the flow not stop at breakpoint?

android - Cocos2dx C++ 处理许多纹理

c - 在构建依赖项之前在 makefile 中回显

c++ - 与 Boost Xpressive 进行不区分大小写的匹配

c++ - 如何改变operator=的返回值?

c - 串口卡在 close() 上

c - 如何以编程方式打开默认浏览器并在 C/Linux 中传递 URL?

c - 无法比较 C 中的值

c++ - 为什么使用 int、unsigned int 或 size_t 会给出不同的结果?

c - 在这段代码中,为什么 Write() 不适用于 Int?