我有以下代码行,需要在项目中的许多文件中编写:-
#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
。否则调用该函数。
如何尝试:
#ifdef SOME_CHECK
#define foo(x,y,z) foo(x,y,z);
#else
#define foo(x,y,z)
#endif
执行此操作的经典方法是:
#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 */
都会产生语法错误。这不是世界末日;它们都是可怕的代码,不应该被鼓励。但这是您必须为您的项目做出的判断。