0

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

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

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

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

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

4

3 回答 3

3

为什么不这样做?

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

从而设置任何出现的foo将被删除SOME_CHECK。否则调用该函数。

于 2013-11-08T05:46:55.080 回答
0

如何尝试:

#ifdef SOME_CHECK
#define foo(x,y,z) foo(x,y,z);
#else
#define foo(x,y,z)
#endif
于 2013-11-08T05:49:24.133 回答
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 */都会产生语法错误。这不是世界末日;它们都是可怕的代码,不应该被鼓励。但这是您必须为您的项目做出的判断。

于 2013-11-08T06:12:20.013 回答