0

当前用于在调试模式下显示调试输出:

#ifdef _DEBUG
#define printX(...) Serial.printf( __VA_ARGS__ )
#else
#define printX(...) NULL
#endif 

但这仍然在结果代码中包含 printX,并且已应用的参数仍然消耗内存、cpu 功率和堆栈大小,所以我的问题是:

  • 有没有办法拥有一个不包括函数的宏,并且在“发布模式”下“忽略”源代码中的所有调用并且基本上不使用它编译任何东西?
4

3 回答 3

2

宏不是函数。它不消耗任何内存、cpu 功率或堆栈大小。这是因为宏完全在编译时运行,只是充当文本替换机制。当程序运行时,没有被“调用”的宏。

于 2021-07-04T10:35:03.363 回答
1

#define printX(...) NULL

用 plain替换printX函数调用的所有参数NULL。这是在编译器能够查看代码之前发生的文本替换,因此内部的任何嵌套调用printX,例如

printX(someExpensiveCall())

也将被彻底淘汰。

于 2021-07-06T06:49:04.890 回答
1

在我的程序中,我包含一行内容:

#define DEBUG_MODE

我在任何我想用(或不用)调试模式编译的地方使用它:

#ifdef DEBUG_MODE
    print here all the info I need for debug and certainly don't want in released binary.
#endif

在发布最终的二进制文件之前,我将定义行注释掉。

于 2021-07-04T16:00:20.063 回答