C/C++的宏如何拆分输入参数
宏对于输入参数可以有各种使用技巧,比如#和##进行参数粘贴等。但在特定场景下,还是有一些不足。
比如有一系列重载函数
bool func(int a, int b);
bool func(double a, double b);
bool func(int a, double b);
现在有两个未知类型变量a,b,想要调用这两个函数并且打印变量,用宏来写,有两种写法:
第一种
#define TEST(a, b)
if (func(a, b)) cout << a << ", " << b << endl; else cout << "error" << endl;
使用第一种:
TEST(a, b);
第二种
#define TEST(condition, a, b)
if (condition) cout << a << ", " << b << endl; else cout << "error" << endl;
使用第二种:
TEST(func(a, b), a, b);
实际使用下来,第二种会更好一些,因为只要在IDE编辑器中点击func即可跳转实际使用的重载函数,对函数进行修改。
而第一种无法跳转到实际重载函数,当然第一种可以有这种使用方法:
TEST(a, b, func(a, b));
但这样的写法,和第二种一样,缺点很明显,就是需要多写一次变量(a, b),因此想问,
有没有一种宏的参数拆分方法可以将参数func(a, b)中的(a,b)提取出来,然后再次给cout来使用?
C/C++的宏如何拆分输入参数
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注 在现代的C++编程中,避免使用宏来实现这类操作是比较推荐的做法,因为宏容易导致一些不可预见的副作用和编程错误,比如命名冲突,调试困难等问题。一般来说,我们应该更多地使用函数(例如,模板函数、lambda表达式、constexpr等)来实现这些功能,因为这样可以得到更安全、更有类型检查和更易于调试的代码。
然而,针对你的具体问题,C或C++的预处理器中并没有直接提供从宏参数中提取部分数据的功能,C++的宏预处理器只是一个文本替换工具,它在编译阶段之前运行,不具备任何语义分析能力,这限制了它的能力。宏的参数在宏扩展时会被替换为实际的参数值,但是这个过程是文本级别的,无法进行更复杂的操作。
如果你确定需要使用宏,并且希望减少重复输入参数,也许可以使用C++11之后版本中提供的可变参数模板,或者分别定义一个打印函数和处理函数来避免重复输入参数。
例如:template<typename... Args> bool processFunc(Args... args) { if(func(args...)) { std::cout << ...args << std::endl; return true; } else { std::cout << "error" << std::endl; return false; } } #define TEST(...) processFunc(__VA_ARGS__);
在这个例子中,Args... args是一个参数包,它可以包含任意数量和类型的参数。func(args...)展开这个参数包,调用对应的函数。然后,std::cout << ...args << std::endl;将参数包再次展开,用于打印各个参数。
最后,通过使用TEST(...)宏,就可以将所有参数传给processFunc。例如:int a = 1; double b = 2.0; TEST(a, b);
这样就可以避免重复输入参数。
请注意,虽然这样的代码可以运行,但是它违反了"易于理解"和"尽量避免使用宏"的原则,因此在工业级的代码中并不推荐使用。这样的代码可能难以理解和维护,也更容易引入错误。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 BP神经网络控制倒立摆
- ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
- ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
- ¥30 Unity接入微信SDK 无法开启摄像头
- ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
- ¥20 cad图纸,chx-3六轴码垛机器人
- ¥15 移动摄像头专网需要解vlan
- ¥20 access多表提取相同字段数据并合并
- ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
- ¥20 Java-Oj-桌布的计算