将某些代码行包装到单个宏中的方法
Ways to wrap some lines of code into a single macro
我有以下代码行需要跨项目中的许多文件编写:-
#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
相关文章:
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 具有字符串化的可变参数宏的现代/通用方法
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- std::bind,无法让具有单个参数的方法工作
- c++ 替换调用对象方法的宏函数
- 在C++中有多个指向单个对象的指针的正确方法是什么?
- 将动态方法添加到类中:使用宏函数到头文件中
- 在调试配置中仅优化单个方法
- 将 CTYPE 宏转换为 C++ 常量的方法
- C++或宏魔术来生成方法和转发参数
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- 如何优雅地实现具有可变输出的单个方法?
- 将多个参数作为单个宏参数传递
- 将某些代码行包装到单个宏中的方法
- 返回不同类型变量的单个 get 方法
- 强制与 GCC、Clang 和英特尔编译器中的单个宏内联
- 轻松标记++如何使用单个宏进行配置
- 宏方法有 2 个返回
- 创建可变宏/方法,打印所有变量的名称和值
- 在C或c++源文件中展开单个宏