如何使用'#define';定义一个宏来执行多个方法

how use the '#define' define a macro to exectue mutiple method?

本文关键字:一个 执行 方法 #39#define 何使用 定义      更新时间:2023-10-16

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

#define logi method1 method2

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

首先:如果可以的话,避免宏。如果是在一个序列中调用两个函数,那么更喜欢定义一个内联函数:

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)

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

但是,您可能需要过多地考虑以这种方式使用#define-宏。这样做对我来说似乎没有多大意义。请参阅此处的"何时使用#define">

#include <iostream>
#define logi fun1(); fun2();  
void fun1(void)
{
std::cout << "fun1 calledn";
}
void fun2(void)
{
std::cout << "fun2 calledn";
}
int main(void)
{
logi
return 0;
}