- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在阅读了一些关于滥用异常的线程后(基本上是说如果函数前提条件不正确你不想展开堆栈 - 可能表示你所有的内存都已损坏或同样危险的东西)我正在考虑使用断言() 更频繁。以前我只使用 assert() 作为调试工具,我认为这就是很多 C++ 程序员使用它的方式。我担心我的部分错误处理会被 NDEBUG #define 在未来某个时候引入运行时构建而关闭。有没有办法解决这个问题,其他人对此有疑问(即我应该担心它)吗?
谢谢,帕特
编辑:我正在阅读的线程的要点是,如果您的应用程序确实存在问题,那么展开堆栈可能会损坏系统,例如,如果析构函数向文件写入内容并且文件句柄已损坏。我并不是建议使用 assert 进行正常的错误处理。我当前的用例非常薄弱,但看看您的想法:
//check later code won't crash the system
if( buf.length() % 2 )
return false;
// do other stuff that shouldn't affect bufs length
//copy 2 bytes into buf at a time, if length is odd then don't know
//what will happen so use assert to make sure it can't damage anything
assert( !(buf.length() % 2) );
for( i = 0; i != buf.length(); i += 2 )
memcpy( buf + i, data, 2 );
edit2:讨论在这里: http://groups.google.com/group/comp.lang.c++.moderated/browse_frm/thread/80083ac31a1188da
最佳答案
您可以构建自己的断言,而不是使用常用的 C assert.h。您的断言不会被禁用。
查看 assert() 是如何在/usr/include/assert.h(或其他地方)中实现的。这只是一些预处理器魔法,最终调用“断言失败”函数。
在我们的嵌入式环境中,我们一直在替换 assert()。
关于c++ - 断言和 NDEBUG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/389180/
所以基本上我有一个用 C 编写的程序,它由几个 .c 文件组成。它们的 makefile 如下所示: CC=gcc CFLAGS=-I. DEBUGFLAGS=-D NDEBUG -O3 defaul
在阅读了一些关于滥用异常的线程后(基本上是说如果函数前提条件不正确你不想展开堆栈 - 可能表示你所有的内存都已损坏或同样危险的东西)我正在考虑使用断言() 更频繁。以前我只使用 assert() 作为
C++ Primer 说 The behavior of assert depends on the status of a preprocessor variable named NDEBUG. W
考虑在 my_lib.a 和与 my_lib.a 链接的 my_prog 中编译的 C++ 头文件。该库是在没有 NDEBUG 的情况下编译的,而 my_prog - 有 NDEBUG。会导致 ODR
对于上面的例子,我试图弄清楚 increment 方法是否真的会被内联。如果在我定义 NDEBUG 标志时断言将被编译器删除,增量方法将变成单行,因此它被实际内联的可能性会增加。所以问题归结为删除断言
我想定义一个与标准 assert(3) 相同的 assert 宏除了在定义 NDEBUG 时它不会被预处理器删除外,调用其他情况。 这样的调用,让我们在这里称它为 assert2,例如,如果您希望在软
我的大部分类都有调试变量,这使得它们通常看起来像这样: class A { // stuff #ifndef NDEBUG int check = 0; #endif }; 方法可能如
我有相当大的一段代码,在开发版本中运行良好,代码中有许多 assert()。我使用传递给 g++ 的 -DNDEBUG 指令禁用了断言,现在我的代码因 seg 而中断。过错。关于 assert() 有
我在一篇文章中读到,放置以下预处理器行会忽略所有后续的断言预处理器指令。但这似乎不起作用,实际上 assert 语句由预处理器处理,并在不满足 assert 中的条件时中止程序(我知道当不满足 ass
应该使用哪个预处理器定义来指定代码的调试部分? 使用 #ifdef _DEBUG 或 #ifndef NDEBUG 或者有更好的方法,例如#define MY_DEBUG? 我认为 _DEBUG 是
我正在使用以下宏来打印我在网络上找到的调试信息。效果很好。但是,我想在调试调用函数 A 的函数 B 时关闭函数 A 的调试打印。我尝试了 #define NDEBUG function A #unde
Why does assert not work here? ^ 显然,Rcpp 有自己定义 NDEBUG 的习惯,即使不是我自己定义的。 m@m-X555LJ:~/wtfdir$ cat WTF.r
我正在审核一些使用 Qt 框架编写的源代码。典型的发布构建命令行输出包括 QT_NO_DEBUG 预处理器宏,但不包括 Posix 的 NDEBUG 预处理器宏。 Qt documentation o
当宏 NDEBUG 定义时,标准 C assert 宏被禁用,意思是“不调试”。这会导致非常糟糕的双重否定情况,例如 #ifndef NDEBUG//DebuggingCode #endif。似乎 R
我对各种平台/编译器(“实现”)/框架分配给 C 和 C++ 预处理器宏 NDEBUG 的用途感兴趣。 C和C++标准只提到过一次这个定义,即控制assert()宏的行为。 我会要求只包含具体的答案,
我读到有人担心过度使用 noexcept 可能会阻碍可测试的库。 考虑: T& vector::front() noexcept { assert(!empty()); //
当与 boost::serialization 链接时,我在项目的“发布”版本中遇到问题。我的“调试”和“发布”构建之间唯一真正的区别是我定义了 DEBUG 并在调试中使用了 -O0 并且我定义了 N
可以在我们的开发和生产应用程序的控制台中看到以下代码: #ifndef NDEBUG NSLog(@"log message"); #endif 谁能告诉我发布应用程序怎么可能?我们使用 Xc
如果我在 main.cpp 的顶部定义 NDEBUG,我会得到所有这些错误: 1> All outputs are up-to-date. 1>libcmt.lib(invarg.obj) : er
环境: $ g++ --version g++ (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0 众所周知,在包含 assert.h 之前定义的 NDEBUG 可以禁用用于调试的
我是一名优秀的程序员,十分优秀!