使用C预处理器指令进行编译时检查

使用C预处理器指令进行编译时检查,c,macros,c-preprocessor,compile-time,preprocessor-directive,C,Macros,C Preprocessor,Compile Time,Preprocessor Directive,是否有办法使myLOGGING-宏(如下所示)中的日志级别检查在编译时进行?编译时已经知道条件(如果(pLogLevel)是否可以有条件地定义宏本身,这应该是可能的: #if LOG_LEVEL > 0 # define LOG(...) printf(__VA_ARGS__) #else # define LOG(...) #endif #if LOG_LEVEL > 1 // and so forth 一种方法是将日志级别合并到日志宏中 这将创建一组宏,这些宏将根据日志级

是否有办法使my
LOGGING
-宏(如下所示)中的日志级别检查在编译时进行?编译时已经知道条件(如果(pLogLevel)是否可以有条件地定义宏本身,这应该是可能的:

#if LOG_LEVEL > 0
#  define LOG(...) printf(__VA_ARGS__)
#else
#  define LOG(...)
#endif

#if LOG_LEVEL > 1
// and so forth

一种方法是将日志级别合并到日志宏中

这将创建一组宏,这些宏将根据日志级别打开或关闭

您将使用这些宏,它们是否显示取决于编译时的日志级别

LOGGING_LEVEL_DEBUG("a Debug log.");
//.... some code
LOGGING_LEVEL_EMERG("a Emerge log.");
因此,宏定义如下所示:

    #define LOG_EMERG    0   
    #define LOG_ALERT    1   
    #define LOG_CRIT     2   
    #define LOG_ERROR    3   
    #define LOG_WARN     4   
    #define LOG_NOTICE   5   
    #define LOG_INFO     6   
    #define LOG_DEBUG    7   
    #define LOG_NONE     8   

    /* set the global logging level here */
    #define LOG_LEVEL LOG_INFO

    void print_timestamp(void);

    #if LOG_LEVEL >= LOG_DEBUG
    #define _LOG_PREAMBLE                                       \
            fprintf(stdout, "%s:%d ", __FILE__, __LINE__);
    #else
    #define _LOG_PREAMBLE                                       \
            print_timestamp();
    #endif

    #if LOG_LEVEL >= LOG_EMERG
        #define LOGGING_LEVEL_EMERG(...) \
            {                                                         \
                _LOG_PREAMBLE                                         \
                fprintf(stdout, "EMERG ");                                           \
                fprintf(stdout, ##__VA_ARGS__);                       \
            }   

        #else
        #define LOGGING_LEVEL_EMERG(...)
        #endif

        #if LOG_LEVEL >= LOG_ALERT
        #define LOGGING_LEVEL_ALERT(...) \
            {                                                         \
                _LOG_PREAMBLE                                         \
                fprintf(stdout, "ALERT ");                                           \
                fprintf(stdout, ##__VA_ARGS__);                       \
            }   

        #else
        #define LOGGING_LEVEL_ALERT(...)
        #endif

打开优化时,如果条件为false,编译器很可能会删除LOGGING()宏的代码,如果条件为true,编译器也会删除if()条件检查,只留下if()的主体留在代码中。如果没有,我会将其作为bug提交给编译器。这是代码生成器的工作。它可以看到if()语句始终为false,并且知道如何消除代码。您不必帮助,只需确保启用了优化器。谢谢你们两位。这些都是有用的注释。编译器或优化器在条件中分别启用/禁用始终为true或false的代码绝对有意义。
    #define LOG_EMERG    0   
    #define LOG_ALERT    1   
    #define LOG_CRIT     2   
    #define LOG_ERROR    3   
    #define LOG_WARN     4   
    #define LOG_NOTICE   5   
    #define LOG_INFO     6   
    #define LOG_DEBUG    7   
    #define LOG_NONE     8   

    /* set the global logging level here */
    #define LOG_LEVEL LOG_INFO

    void print_timestamp(void);

    #if LOG_LEVEL >= LOG_DEBUG
    #define _LOG_PREAMBLE                                       \
            fprintf(stdout, "%s:%d ", __FILE__, __LINE__);
    #else
    #define _LOG_PREAMBLE                                       \
            print_timestamp();
    #endif

    #if LOG_LEVEL >= LOG_EMERG
        #define LOGGING_LEVEL_EMERG(...) \
            {                                                         \
                _LOG_PREAMBLE                                         \
                fprintf(stdout, "EMERG ");                                           \
                fprintf(stdout, ##__VA_ARGS__);                       \
            }   

        #else
        #define LOGGING_LEVEL_EMERG(...)
        #endif

        #if LOG_LEVEL >= LOG_ALERT
        #define LOGGING_LEVEL_ALERT(...) \
            {                                                         \
                _LOG_PREAMBLE                                         \
                fprintf(stdout, "ALERT ");                                           \
                fprintf(stdout, ##__VA_ARGS__);                       \
            }   

        #else
        #define LOGGING_LEVEL_ALERT(...)
        #endif