使用宏 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";
}
}
这样做的直接好处是即使在编译出来的时候仍然检查代码是否有效。
它还可以干净地处理仅在调试中需要的变量,这些变量在使用基于宏的条件编译时通常会导致仅发布警告消息。
我有一些用于调试的代码,不希望出现在发行版中。
我可以使用 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";
}
}
这样做的直接好处是即使在编译出来的时候仍然检查代码是否有效。
它还可以干净地处理仅在调试中需要的变量,这些变量在使用基于宏的条件编译时通常会导致仅发布警告消息。