根据http://cnicholson.net/2009/02/stupid-c-tricks-adventures-in-assert/中的建议,我已经使用自己的emp_assert
版本一段时间了。当设置了NDEBUG时,我的assert如下:
#define emp_assert(EXPR) ((void) sizeof(EXPR) )
该定义确保在编译器中,EXPR 中的任何变量仍然被视为“使用过”,但不会影响运行时性能。
不幸的是,我最近发现,在 assert 中使用 lambda 会产生编译错误,因为 lambda 无法放入 sizeof 中。
我的选择似乎有:
1. 简单地去除 sizeof;我的代码中很少有未使用变量的情况,可以手动处理它们。
2. 避免在 assert 中使用 labda。
3. 想出一个可以产生同样效果的 sizeof 替代方案。
目前,选项1是我的首选,但我使用这个断言系统来完成许多项目,并且可能在一段时间内遇到问题。
选项2似乎太过局限,特别是因为我可以想象未来会出现意外的交互。
选项3将是最优雅的解决方案,但我需要帮助想出如何实现它的想法。
编辑:以下是一些示例代码,以说明问题。
#include <iostream>
#include <algorithm>
#include <vector>
#define NDEBUG
// Relevant excerpt from "emp_assert.h"
#ifdef NDEBUG
#define emp_assert(EXPR) ((void) sizeof(EXPR))
#else
#define emp_assert(EXPR) \
do { if ( !(EXPR) ) { \
std::cerr << "Assert Error (In " << __FILE__ \
<< " line " << __LINE__ \
<< "): " << #EXPR << std::endl; \
abort(); } \
} while (0)
#endif
// Code to trigger the problem (asserting that all ints in a vector are less than 8.)
int main()
{
std::vector<int> v = {1, 2, 3, 4, 8};
emp_assert( std::all_of(v.begin(), v.end(), [](int i){return i < 8;}) );
}
将#define NDEBUG
注释掉,以查看代码在编译时是否正确并在运行时触发断言。(如果不想触发断言,请从向量中删除8)。
我使用g++ -std=c++11 file.cc
进行编译。
emp_assert
的作用是什么?它与assert
或static_assert
有何不同之处? - M.Memp_assert
并展示问题的代码吗? - M.M