Multiple preprocessor directives on one line in C++

前端 未结 3 1835
盖世英雄少女心
盖世英雄少女心 2021-02-07 16:26

A hypothetical question: Is it possible to have a C++ program, which includes preprocessor directives, entirely on one line?

Such a line would look like this:

         


        
相关标签:
3条回答
  • 2021-02-07 16:40

    A preprocessing directive must be terminated by a newline, so this is actually a single preprocessing directive that defines an object-like macro, named foo, that expands to the following token sequence:

    # ifdef foo # define bar # endif
    

    Any later use of the name foo in the source (until it is #undefed) will expand to this, but after the macro is expanded, the resulting tokens are not evaluated as a preprocessing directive.

    This is not compiler-specific; this behavior is defined by the C and C++ standards.

    0 讨论(0)
  • 2021-02-07 16:48

    A few years late - but here is a pattern I use every day:

    #ifdef _DEBUG
        #define DEBUGTRACE(debuglevel, code)    \
            if ( traceLevelActive(debuglevel) ) \
                {code}
    #else
        #define DEBUGTRACE(debuglevel, code)
    #endif
    

    Usage:

    DEBUGTRACE(DEBUG_LEVEL2, printf("you are in debug mode"); );
    

    or, more elaborate:

    DEBUGTRACE(DEBUG_LEVEL2, {
        if (somethingistrue)
            printf("Debugging is TRUE");
        else
            foo();
    });
    

    If _DEBUG is defined, then your code is include. If not, then nothing is not compiled.

    0 讨论(0)
  • 2021-02-07 16:54

    Preprocessor directives are somewhat different than language statements, which are terminated by ; and use whitespace to delimit tokens. In the case of the preprocessor, the directive is terminated by a newline so it's impossible to do what you're attempting using the C++ language itself.

    One way you could kind of simulate this is to put your desired lines into a separate header file and then #include it where you want. The separate header still has to have each directive on one line, but the point where you include it is just a single line, effectively doing what you asked.

    Another way to accomplish something like that is to have a pre-C++ file that you use an external process to process into a C++ source file prior to compiling with your C++ compiler. This is probably rather more trouble than it's worth.

    0 讨论(0)
提交回复
热议问题