使用宏 C++ 在发布模式下删除代码

Removing code in Release mode using macros C++

我有一些用于调试的代码,不希望出现在发行版中。
我可以使用 macros 将它们注释掉吗?
例如:

#include <iostream>

#define p(OwO) std::cout << OwO
#define DEBUG 1    // <---- set this to -1 in release mode

#if DEBUG == 1
#define DBUGstart
#define DBUGend
// ^ is empty when in release mode
#else
#define DBUGstart /*
#define DBUGend    */
/*
IDE(and every other text editor, including Stack overflow) comments the above piece of code,
problem with testing this is my project takes a long
time to build
*/
#endif

int main() {
    DBUGstart;
    p("<--------------DEBUG------------->\n");
    // basically commenting this line in release mode, therefore, removing it
    p("DEBUG 2\n");
    p("DEBUG 3\n");
    DBUGend;
    p("Hewwo World\n");
    return 0x45;
}

对于单行调试,我可以轻松地执行以下操作:

#include <iostream>

#define DEBUG -1  // in release mode
#define p(OwO) std::cout << OwO

#if DEBUG == 1
#define DB(line) line
#else
#define DB(line)
#endif

int main()
{
    DB(p("Debug\n"));
    p("Hewwo World");
    return 0x45;
}

但我想多行会有点乱

我正在使用 MSVC (Visual Studio 2019),如果这不起作用,那么是否有任何其他实现相同方法的方法(对于多行,对于单行)?

你把事情变得不必要的复杂了。

在 Release 中不是有条件地插入 C 风格的注释,而是只在 Debug 中插入代码。 Visual Studio 在 Debug 配置中默认定义了 _DEBUG,所以你可以像下面这样使用它:

#include <iostream>

int main() {

    std::cout << "hello there.\n";

#ifdef _DEBUG
    std::cout << "this is a debug build.\n";
#endif

}

您甚至不需要为此使用宏。条件编译已融入语言:

#include <iostream>

constexpr bool gDebug = true;

int foo();

int main() {

    std::cout << "hello there.\n";

    int foo_res = foo();

    if constexpr (gDebug) {
       std::cout << "Foo returned: " << foo_res << "\n";
    }
}

这样做的直接好处是即使在编译出来的时候仍然检查代码是否有效。

它还可以干净地处理仅在调试中需要的变量,这些变量在使用基于宏的条件编译时通常会导致仅发布警告消息。