我需要在项目中的许多文件中编写以下代码行: -
#if SOME_CHECK
foo(x, y, z);
#endif
为此,我打算将上面3行代码包装成一个像这样的宏 -
#define foo(x, y, z) #if SOME_CHECK \
foo(x, y, z); \
#endif
但是,由于显而易见的原因,这给了我错误,我无法想到一个更好的方法来利用预处理器宏来包装这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)
这样做的经典方法是:
#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 */
都会产生语法错误。这不是世界末日;它们都是可怕的代码,不应该被鼓励。但这是你必须为你的项目做出的判断。