我对各种平台/编译器("实现")/框架分配给C和C++预处理器宏的目的感兴趣NDEBUG.
该Ç以及C++标准只提及这个定义一次,即控制的行为assert()宏.
我会要求只包含特定的答案,您知道C或C++ 的某个平台/框架/库使用该NDEBUG定义来启用或禁用除标准定义的assert()宏之外的任何其他内容.
提出这个问题的一个原因是MS(Visual-C++)总是(?)使用"他们的" _DEBUG定义来区分调试和发布内容,我想知道这是否是图书馆/平台的常见做法"自己的"调试定义或其他库/平台是否NDEBUG用于调试相关的东西.
我们的构建系统已经以某种方式发生了变化,使得优化的构建不再将-DNDEBUG添加到编译行.我搜索了我们的makefile,却找不到这个.
所以问题是,-DNDEBUG在哪里发源于大多数人以及这可能会如何改变?在我们确实有-DNDEBUG之前,我不认为这是从我们的任何makefile中删除的.
谢谢.
-威廉
CMake用于编译一些C++文件.assert代码中有调用.在CMake的发布模式下禁用这些调用.NDEBUG我猜它在发布模式中定义.
如果我对在CMake的发布模式下断言感兴趣,我该如何启用它?
我只是想在调试模式下构建一个cmake项目来启用断言.我尝试了以下版本:
cmake -D CMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE=Debug -L ../../
Run Code Online (Sandbox Code Playgroud)
不幸的是,没有一个具有所需的效果 - CMAKE_BUILD_TYPE设置为Debug(因此NDEBUG-flag不会传递给gcc).
另外,我添加variable_watch(CMAKE_BUILD_TYPE)到我的主要CMakeLists.txt检查值是否被覆盖了某处.但第一个输出是READ_ACCESS在我的主要另外我添加variable_watch(CMAKE_BUILD_TYPE)到我的主要CMakeLists.txt和价值已经存在Release.
有人知道为什么cmake会忽略配置吗?
我正在使用cmake版本2.8.7.
提前感谢您的帮助!
我想创建我自己的版本,assert其中它会打印一些日志,以防在NDEBUG模式下调用断言。
我试图做到这LD_PRELOAD一点并重新定义断言宏,但它似乎完全忽略了宏定义,并且覆盖__assert_fail是无关紧要的,因为在NDEBUG.
我怎样才能覆盖libc assert宏?
我不想创建不同的函数,因为项目中已经大量使用了断言。