我多年来一直在使用各种 xunit 测试(从 2000 年代初的 cppunit 开始)。在所有情况下,在失败时设置断点都很容易:有一个函数指示检测到的失败:
b 'atf::tests::tc::fail(std::string const&)' 命令向上 1 结束
看起来 gtest 是相当不同的,对 gtest 做同样的事情的既定做法是什么?
我确实为类成员编写了 c++ 访问器作为
SomeClass const& x() const { return m_x; }
Run Code Online (Sandbox Code Playgroud)
似乎在 c# 中这种类型的唯一保护是使用私有(或未定义)集定义属性。但这只能防止赋值,而不能防止对某些类状态的操纵。
旁注:c++ 允许通过 const 指针删除 m_x - 恕我直言,这只是对标准主体的惊人监督。
假设我在每个级别上嵌套方法a,b,c,d,e我们在正常操作过程中返回错误,但是e也可能抛出异常(例如STL插入时的内存不足).例外非常少,实际展开的速度和速度有多快不是问题.
在这种情况下,最合适的异常处理策略是什么?
优点:不需要编写异常安全代码,最简单的实现,最容易测试,最容易理解,放松所需的最小编译时间信息.
缺点:看起来并不酷,添加明显的try/catch哒 - 实际上围绕每个insert和push_back,直到在STL容器周围编写异常安全包装的程度,有观点认为try块有运行时性能损失(并且是没有任何惩罚的意见).
优点:看起来很酷,没有咔嗒声.
缺点:很难直观地验证中间的所有代码确实是异常安全的,以测试所有异常展开路径
优点:可预测,将容忍异常安全代码中的轻微瑕疵,比崩溃更好.
缺点:方式过于苛刻
void a()
{
...
x = b();
...
}
int b()
{
y = c();
...
return y + d();
}
int d()
{
...
z = e();
...
}
Run Code Online (Sandbox Code Playgroud) 在许多情况下,我想传递对 const 字符串参数的引用,默认为空字符串。
void func(std::string const& z = std::string());
Run Code Online (Sandbox Code Playgroud)
我想知道调用默认构造函数与传递对某些静态空字符串的引用有多昂贵?
void func(std::string const& z = my_staticEmptyStr);
Run Code Online (Sandbox Code Playgroud)
列表和向量呢?
更新。不幸的是,除了在每个需要它的类中都有自己的副本之外,我没有看到一种很好的通用方法来拥有静态空 xxx 对象。幸运的是,在我看来,stl 类的默认构造函数都不需要内存分配,所以我决定在所有路径上以传统方式进行分配,除了经常调用的路径。
我有一个 istream,我必须将其读入缓冲区。一旦遇到 eof,我找不到一种方法来找出 read_len 吗?我无法使用 get,因为我的文件没有分隔符。
似乎唯一的选择就是逐个字符地阅读它,这真的是唯一的选择吗?
char buffer[128];
while(is.good()) {
is.read(buffer, sizeof(buffer));
size_t read_len = sizeof(buffer);
if (is.eof()) {
read_len = xxxx;
}
process(buffer, read_len);
}
Run Code Online (Sandbox Code Playgroud) c++ ×4
binary-data ×1
c# ×1
constants ×1
gdb ×1
googletest ×1
istream ×1
performance ×1
stl ×1