如何使用'#define';定义一个宏来执行多个方法
how use the '#define' define a macro to exectue mutiple method?
我使用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;
}
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 为什么我的最后一个 ELSE 条件无法正确执行
- C++将一个指针分配给另一个指针时执行的类型检查
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何制作一个只能在一个线程上同时执行的函数?
- 编写一个读取五个整数并执行一些任务的C++程序
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- 为什么循环体中的一个基本算术运算执行得比两个算术运算慢
- 为什么其中一个 while 循环没有被执行 (C++)?
- readAll() 或 readAllStandardOutput() 在执行之前也返回一个空字符串
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 是否可以在每次使用std::cout时执行一个函数
- 在使用PyInstaller冻结Python脚本时包含一个C++可执行文件
- 如何创建一个函数来执行其中的其他函数
- 哪一个执行起来更快
- 在一个执行函数中使用多个终端命令
- 我不能得到一个执行加载函数在使用Qt库工作