Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;:检测调试/发布的便携式方法?_C++_C - Fatal编程技术网

C++ C/C++;:检测调试/发布的便携式方法?

C++ C/C++;:检测调试/发布的便携式方法?,c++,c,C++,C,是否有一个标准化的定义(例如,由所有主要编译器实现)#允许我区分调试版本和发布版本?如果您相信 #ifdef NDEBUG // nondebug #else // debug code #endif 是最便携的 但是没有编译器知道您是在编译debug还是release,所以这不是自动的。但是这个是由assert.h在c-runtime中使用的,所以它非常常见。Visual Studio将设置它,我相信大多数其他IDE也将设置它。编辑:我误读了这个问题,并偏离了另一条切线!!!道

是否有一个标准化的定义(例如,由所有主要编译器实现)#允许我区分调试版本和发布版本?

如果您相信

 #ifdef NDEBUG
  // nondebug
 #else
  // debug code
 #endif
是最便携的


但是没有编译器知道您是在编译debug还是release,所以这不是自动的。但是这个是由assert.h在c-runtime中使用的,所以它非常常见。Visual Studio将设置它,我相信大多数其他IDE也将设置它。

编辑:我误读了这个问题,并偏离了另一条切线!!!道歉。。。 宏NDEBUG在Linux和Windows上都使用

如果生成了二进制文件,并且您需要确定生成是否为release/debug,那么如果您在其中看到大量可能是调试信息的符号,您可以获得一个十六进制转储…例如,在Linux下,使用该实用程序。有一个由SysInternals提供的适用于Windows的版本,可在此处获得。二进制可执行文件的发行版本不会有表示不同符号的字符串

strings some_binary 一些字符串是二进制的 希望这有帮助, 顺致敬意,
Tom.

因为没有调试或发布的标准定义,所以没有办法做到这一点。我能想到至少四种不同的含义,它们都可以独立改变。在代码中只能测试两个

  • 编译器优化级别
  • 二进制文件中包含的调试符号(这些符号甚至可以在以后删除)
  • 已启用assert()(未定义NDEBUG)
  • 日志记录已关闭

  • 实际上,我从事的主要项目是,我们在版本中不断进行调试,但让它在运行时确定详细程度。事实证明,它在野外寻找bug时非常有用,在未启用时,开销最小(很难注意到;没有用户投诉)。在嵌入式环境之外,我会考虑这样一种方法。什么是“发布构建”?C++标准没有定义它,所以没有可检测的方法来检测是否有发布版本。前面没有一个标记表示它可能在C或C++标准中提到的某个地方。MS在最新版本中非常小心地在其c-runtime头文件中的任何非标准宏或函数前面加上与之不同的“u”。定义NDEBUG将关闭断言宏。没有别的了。这并不意味着调试。@Martin:实际上是非调试。如果只是为了关闭断言宏,他们会称之为NOASSERT。在你开始记分之前,你应该仔细阅读我写的东西。我相信马丁是对的。根据标准,定义NDEBUG所做的唯一事情就是关闭assert。程序员也可以将它用于其他事情,但这超出了标准。C++标准只对NDECG进行了一次引用,而我没有C标准的副本。@ KeiTB:问题是最便携的方式,而不是最符合标准的方式,所以所有这些标准都是不必要的。可以生成带有符号(即函数和静态数据)的二进制文件,但不能生成调试信息(即行号)。也就是说,提供该信息的标志通常存储在任何对象文件格式的头中。试试GNUobjdump(也有一个Windows版本,与MinGW一起分发):objdump-x