如何使用“ #define”定义宏来执行多重方法?

时间:2019-02-01 09:19:48

标签: c++ macros

我使用c ++开发了一个Mac应用程序。我想定义与两个方法的调用相对应的宏“ logi”,以便调用method1()method2()。所以我尝试了这个:

#define logi method1 method2

它不起作用。这种情况的标准写作是什么?非常感谢!

2 个答案:

答案 0 :(得分:2)

首先:如果可以,请避免宏。如果要按顺序调用两个函数,则最好定义一个内联函数:

inline void logi()
{
    method1();
    method2();
}

尽管inline只是对编译器的建议-并且它可能选择不这样做-对于如此简单的函数,您不会发现没有遵循此建议的任何编译器(即使没有了,该函数也会被内联)关键字)。

这种方法更加安全-如果您做错了任何事情,编译器都会在函数定义中向您正确显示。

如果您坚持使用宏:最佳做法是让它看起来像一个函数,如果它的行为类似于您的情况,则如下所示:

#define logi() do { method1(); method2(); } while(false)

如果像在代码中的某个地方一样使用该函数,那么环绕宏使该宏变得健壮,可以想象它没有这样使用:

if(someCondition)
    logi();

猜猜,method2会无条件地被称为 (嗯,另一个示例说明了为什么总是将括号放在分支和循环主体上的优良做法 的原因…… )。

故意跳过冒号,因此用户被迫放置冒号,再次使宏的行为类似于普通函数。

请注意,对于宏,预处理器只不过是简单的文本替换而已。因此,无论您定义什么,它都必须是有效的C ++代码(确切地说:预处理器完成后的结果必须是有效的代码)。如果需要将参数传递给函数,宏将是什么样子?好吧,您也需要将它们包括在宏定义中:

#define logi(A1, A2, B1, B2, B3) do { method1(A1, A2); method2(B1, B2, B3) } while(false)

答案 1 :(得分:0)

我猜你只忘记了';'在两个功能之间。因此,#define宏仅是代码中的文本替换,您需要以';'结束函数调用。

但是您可能想用这种方式使用#define-宏。以这种方式做对我来说似乎没有多大意义。有关“何时使用#define的信息,请参见here

#include <iostream>
#define logi fun1(); fun2();  

void fun1(void)
{
  std::cout << "fun1 called\n";
}

void fun2(void)
{
  std::cout << "fun2 called\n";
}

int main(void)
{
  logi
  return 0;
}