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

时间:2013-11-08 05:41:31

标签: c++ c macros

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

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

为此,我打算将上面3行代码包装成一个像这样的宏 -

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

但是,由于显而易见的原因,这给了我错误,我无法想到一个更好的方法来利用预处理器宏来包装这3行代码。任何人都可以建议一些更好的方法来处理上述问题吗?

3 个答案:

答案 0 :(得分:3)

为什么不这样做?

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

任何foo的出现都将被删除,然后设置SOME_CHECK。否则调用该函数。

答案 1 :(得分:0)

尝试怎么样:

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

答案 2 :(得分:0)

这样做的经典方法是:

foo.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 */都会产生语法错误。这不是世界末日;它们都是可怕的代码,不应该被鼓励。但这是你必须为你的项目做出的判断。