stophin 2024-01-25 09:42 采纳率: 50%
浏览 13
已结题

C/C++的宏如何拆分输入参数

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来使用?

  • 写回答

3条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-01-25 09:52
    关注

    在现代的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);
    
    
    

    这样就可以避免重复输入参数。
    请注意,虽然这样的代码可以运行,但是它违反了"易于理解"和"尽量避免使用宏"的原则,因此在工业级的代码中并不推荐使用。这样的代码可能难以理解和维护,也更容易引入错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月25日

悬赏问题

  • ¥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-桌布的计算