有没有一种标准的方法来做这样的事情?
标准库或提升是首选。
为了说清楚,断言' (可能是一个不同的术语)我在这里使用,特别是关于运行时问题,而不是编程问题,比如Java世界中的Spring Assert。
Microsoft.VisualStudio.TestTools.CppUnitTestFramework是很好的候选人,但它是出于测试目的。
答案 0 :(得分:4)
在我使用的一些项目中:
void ASSERT(const bool cond, const std::string& text)
{
if (!cond)
{
throw std::runtime_error(text);
}
}
如果您想了解更多信息,可以使用宏来调用实际函数,如下所示:
void ASSERT(const bool cond, const std::string& text, const std::string& file, const int line)
{
if (!cond)
{
throw std::runtime_error(text + ". In file: " + file + " on line: " + std::to_string(line));
}
}
#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)
示例:强>
#include <iostream>
#include <string>
#include <stdexcept>
void ASSERT(const bool cond, const std::string& text, const std::string& file, const int line)
{
if (!cond)
{
throw std::runtime_error(text + ". In file: " + file + " on line: " + std::to_string(line));
}
}
#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)
int main()
{
ASSERT(false, "example text");
}
将导致:
terminate called after throwing an instance of 'std::runtime_error'
what(): example text. In file: example.cpp on line: 17
Aborted
<强>更新强>
要获得与普通assert
相同的行为,即无条件终止该计划,您可以拨打std::abort()
(来自<cstdlib>
)而不是使用throw
:< / p>
void ASSERT(const bool cond, const std::string& text, const std::string& file, const int line)
{
if (!cond)
{
std::cout << text << ". In file: " << file << " on line: " << line << std::endl;
std::abort();
}
}
#define ASSERT(cond, text) ASSERT(cond, text, __FILE__, __LINE__)