c - 如何设置动态切换定义的宏?
问题描述
我试图让我的定义可以在运行时切换,所以我不能启用/禁用打印一些信息。
我有下一个文件:
- 主程序
- 配置文件
- config.h(包含在两个 c 文件中)
在 config.c 中:
//define DEBUG // <--------------- COMMENT THIS TO SWITCH PRINT/NOT PRINT
#define PRINTF(fmt, ...) printf("TAG: " fmt "\n", ## __VA_ARGS__)
#ifdef DEBUG
#define DPRINTF PRINTF
#else
#define DPRINTF(...) do {} while (0)
#endif
int foo()
{
...
if(error){
PRINTF("error happens, code %d", code);
}
else{
DPRINF("all good, all parameters: [%d][%d]", par1, par2);
}
}
(简短说明:如果DEBUG
定义了宏D PRINTF 将打印一些信息,否则什么也不做)
我想要的是能够以某种方式从 main.c 动态切换它,而不是注释/取消注释并重新编译程序。
所以我的想法是在 config.h 中设置
extern uint8_t dbg_status;
#define DGB_ON (1)
#define DGB_OFF (0)
#define ENABLE_DBG (dbg_status? (DGB_ON) : (DGB_OFF))
在 main.c 中做这样的事情:
uint8_t dbg_status;
int main(int argc, char** argv)
{
// enable debug if run with next argument:
// program.exe -DEBUG
if (!strcmp(argv[1], "-DEBUG"))
{
// enable debug prints
dbg_status= 1;
}
else
{
// disable debug prints
dbg_status= 0;
}
...
}
但我现在坚持下去,我不知道下一步该怎么做......
在 config.c 中添加一些额外的定义?
#if (ENABLE_DEBUG)
#define DEBUG
#endif
我觉得我走在正确的道路上,但不知道下一步该往哪里走。
UPD: 来自这里的原始想法: Changing a macro at runtime in C
但我坚持意识到......
解决方案
你可以使用这样的东西:
int debugflag = 0;
void DPRINTF(char *format, ...) {
if (!debugflag)
return;
va_list ap;
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
现在,您可以使用全局变量动态选择debugflag
是否需要调试输出。
对于宏,这是不可能直接实现的,因为它们是在编译时评估的,并且不能在运行时直接受到影响。
推荐阅读
- python-3.x - 添加将 docplex 链接到 python3 的路径
- javascript - 无法更改 AngularJS 上的范围变量值
- python-3.x - 如何将多级索引行转换为多级索引列?
- java - 在 SQL 中获取多个计数
- java - Java Microstream - ImmutablePair 导致 PersistenceExceptionTypeNotPersistable
- node.js - NodeJS:从公共 Tableau 表中获取数据
- c# - 尝试加载到字符串时出现一些奇怪的 XML 问题
- python - 在另一个图像上匹配轮廓或绘制 (png) 轮廓
- java - 有没有办法使用 EasyMock/PowerMock 测试 JUnit 测试中从不使用默认时区?
- grep - grep 输入文件中的确切单词