使用特定库的功能

use*_*381 4 c c++

我有一个问题:我想使用abs库的功能complex.

但是,我发出错误警告我使用的功能abs#define abs(x) (x > 0) ? x : -(x).

因此,我认为问题来自我的进口.由于我还包括stdio和stdlib库,因此编译器可以使用abs其中一个库中定义的函数.

所以我的问题是:如何abscomplex不删除任何导入的情况下使用库的功能?

非常感谢您的回复.

lus*_*oog 15

包裹它周围的parens.

(abs)(whatever);
Run Code Online (Sandbox Code Playgroud)

这将强制编译器使用函数版本,因为宏不再匹配.

类似函数的宏通过匹配标识符后跟左边的paren来工作(.因为我们已经将函数名称本身包装在parens中,所以我们有一个标识符,后跟一个右paren ),它无法与宏匹配.parens在语义上是透明的,但它们会抑制宏语法.

IIRC,这是splintC检查员教给我的.在编写postscript解释器时,我创建了很好的短宏来访问堆栈.

#define push(o) (*tos++ = (o))
#define pop() (*--tos)
Run Code Online (Sandbox Code Playgroud)

这些都很棒,直到它们成为表达的一部分的棘手部分tos.为了避免未定义的行为,我不得不创建函数版本并将它们用于那些棘手的问题.对于新设计,我完全跳过了宏.


编辑:我有一种唠叨的感觉,它实际上是Coelocanthe书(Peter Van Der Linden的Deep C Secrets),在那里我学到了这一点,上面的情况是我第一次需要它.IIRC涉及的示例putchar或者getchar通常在符合C的实现中作为函数和宏实现.

  • 类似函数的宏调用由宏名称后跟一个左括号组成.当编译器看到`abs)`时,它不能是类函数宏的调用,因为名称后面的字符不是开括号. (3认同)

joh*_*ohn 6

使用 #undef

#include "header1.h"
#include "header2.h"
#undef abs // remove abs macro

x = std::abs(y);
Run Code Online (Sandbox Code Playgroud)