lus*_*oog 15
包裹它周围的parens.
(abs)(whatever);
Run Code Online (Sandbox Code Playgroud)
这将强制编译器使用函数版本,因为宏不再匹配.
类似函数的宏通过匹配标识符后跟左边的paren来工作(
.因为我们已经将函数名称本身包装在parens中,所以我们有一个标识符,后跟一个右paren )
,它无法与宏匹配.parens在语义上是透明的,但它们会抑制宏语法.
IIRC,这是splint
C检查员教给我的.在编写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的实现中作为函数和宏实现.
使用 #undef
#include "header1.h"
#include "header2.h"
#undef abs // remove abs macro
x = std::abs(y);
Run Code Online (Sandbox Code Playgroud)