使用C宏启用/禁用LOG级别

put*_* ks 4 c macros

#include <stdio.h>

#define LOG_D(x)  {  printf("D:");  printf(x);}
#define LOG_E(x)  {  printf("E:");  printf(x);}

void test(void)
 {

   LOG_D("ALL is well " );
 }
Run Code Online (Sandbox Code Playgroud)

我有一个非常庞大的代码,它具有不同级别的日志,如上面的代码.在最终测试的库中,我只需要一个错误日志以减少代码大小.

所以我想要这样的东西

#define ENABLE_DEBUG_LOG 0
#define ENABLE_ERROR_LOG 1

#define LOG_D(x)  {#if(ENABLE_DEBUG_LOG==1) printf("D:");  printf(x); #endif}
#define LOG_E(x)  {#if(ENABLE_ERROR_LOG==1)  printf("E:");  printf(x);#endif}
Run Code Online (Sandbox Code Playgroud)

我添加了#if(ENABLE_DEBUG_LOG == 1)只是为了解释,我需要一些可以编译的解决方案.

art*_*rtm 6

另一个选项 - 您可以只注释/取消注释ENABLE_DEBUG_LOGENABLE_ERROR_LOG禁用/启用相应的日志级别.

// #define ENABLE_DEBUG_LOG    // disable DEBUG_LOG
#define ENABLE_ERROR_LOG       // enable ERROR_LOG

#ifdef ENABLE_DEBUG_LOG
#define LOG_D(x)  {  printf("D:");  printf(x);}
#else
#define LOG_D(x) // nothing
#endif

#ifdef ENABLE_ERROR_LOG
#define LOG_E(x)  {  printf("E:");  printf(x);}
#else
#define LOG_E(x)  // nothing
#endif
Run Code Online (Sandbox Code Playgroud)


M O*_*ehm 5

您不能嵌套预处理器指令。但是您可以制作两个版本的宏,然后在#if或的专有部分中定义它们#ifdef

#define ENABLE_DEBUG_LOG 0

#if ENABLE_DEBUG_LOG != 0
#define LOG_D(...)  printf("D: " __VA_ARGS__)
#else
#define LOG_D(...)  // Do nothing
#endif
Run Code Online (Sandbox Code Playgroud)

在这里,禁用的版本只是“吃掉”了LOG_D宏而没有执行任何操作。(请注意,未定义的宏在#if条件中被视为值0。)