如何使在线编译器忽略 C++ 中的调试语句?

Posted

技术标签:

【中文标题】如何使在线编译器忽略 C++ 中的调试语句?【英文标题】:How to make online compilers to ignore debug statements in C++? 【发布时间】:2021-12-31 17:16:20 【问题描述】:

我正在使用这些代码行来调试我的 C++ 程序。

    void dbg_out()cerr << endl;
    template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T)  cerr << ' ' << H; dbg_out(T...); 
    #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)

但是这样做的问题是,当我使用 dbg 函数并提交给 codeforces 或 codechef 等在线法官时,它会增加代码的执行。有没有办法让在线编译器忽略调试语句?

【问题讨论】:

#if 0 是禁用代码的相当标准的方法 只需将#define dbg(...) cerr &lt;&lt; "(" &lt;&lt; #__VA_ARGS__ &lt;&lt; "):", dbg_out(__VA_ARGS__) 替换为#define dbg(...)? 将代码括在#ifdef WHATEVER中,当你想登录时,用-DWHATEVER编译? 为什么不删除所有调试日志并在本地运行您的代码并附加调试器。然后只需将代码发布到竞争网站。另一种选择是在本地编写一些单元测试并使用它们来验证部分代码是否正确。这些(调试/单元测试)无论如何都是作为软件开发者开发的好技能。而且它们往往有助于提供更简洁的代码。 请注意,您可以将dbg_out 简化为:template&lt;typename... Ts&gt; void dbg_out(Ts... args) ((std::cerr &lt;&lt; ' ' &lt;&lt; args), ...); std::cerr &lt;&lt; std::endl; 【参考方案1】:

你可以让预处理器有条件地定义宏:

#ifdef DEBUG_LOG
  #define dbg(...) std::cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
  #define dbg(...)
#endif

现在,如果您使用选项-DDEBUG_LOG 进行编译,日志将发送到std::cerr。在线法官不会添加该命令行选项,但您可以locally。

【讨论】:

以上是关于如何使在线编译器忽略 C++ 中的调试语句?的主要内容,如果未能解决你的问题,请参考以下文章

can_has_stdio?

在线教程!C++如何在云应用中快速实现编译优化?

允许写入/读取的在线 C++ 编译器

C++ 在线IDE 编译器

推荐 10 款 C++ 在线编译器

Keil(MDK-ARM)使用教程_在线调试