将某些代码行包装到单个宏中的方法

Ways to wrap some lines of code into a single macro

本文关键字:单个宏 方法 包装 代码      更新时间:2023-10-16

我有以下代码行需要跨项目中的许多文件编写:-

#if SOME_CHECK
    foo(x, y, z);
#endif

为此,我计划将上述 3 行代码包装成一个宏,如下所示-

#define foo(x, y, z) #if SOME_CHECK 
foo(x, y, z); 
#endif

但是,由于显而易见的原因,这给了我错误,我想不出更好的方法来利用预处理器宏来包装这 3 行代码。谁能提出一些更好的方法来处理上述问题?

为什么不这样做呢?

#if SOME_CHECK
... The actual function
#else
    #define foo(x,y,z)
#endif

因此,任何foo的出现都将被取消,然后设置SOME_CHECK。否则,将调用该函数。

执行此操作的经典方法是:

福.H

#ifndef FOO_H_INCLUDED
#define FOO_H_INCLUDED
#if SOME_CHECK
extern void foo(int x, int y, int z);
#define FOO(x, y, z) foo(x, y, z)
#else
#define FOO(x, y, z) ((void)0)
#endif
#endif /* FOO_H_INCLUDED */

有条件调用foo()的代码

#include "foo.h"
...
FOO(a, b, c);
...

当SOME_CHECK定义为非零值时,代码将使用给定的参数调用foo()。 如果未定义SOME_CHECK,代码将扩展到编译器将忽略的((void)0)

如果您愿意,您可能可以将替代定义保留为空字符串(而不是使用 ((void)0) ,但如果有人试图在逗号运算符或三元运算符的上下文中使用 FOO(),您会遇到问题,例如:

FOO(a, b, c), ALTEREGO(d, e f);
(x > y) ? FOO(a, b, c) : ALTEREGO(d, e, f);

在这两种情况下,#define FOO(x, y, z) /* Nothing */都会生成语法错误。 这不是世界末日;它们都是可怕的代码,不应该被鼓励。 但这是你必须为你的项目做出的判断。

尝试一下怎么样:

#ifdef SOME_CHECK
#define foo(x,y,z) foo(x,y,z);
#else
#define foo(x,y,z)
#endif