我有一段代码:
// some code, which only do sanity check
expensive checks
// sanity check end
现在我如何告诉编译器强制它退出 这件作品?基本上它意味着我用-O2或者编译时 O3,我不希望它在那里......
谢谢!
答案 0 :(得分:3)
您可以使用常量和单个if / def对来完成此操作。这允许代码仍然被编译并检查错误,但在优化期间被省略。这可以防止可能破坏检查代码的更改未被检测到。
#if defined(USE_EXPENSIVE_CHECKS) || defined(DEBUG)
#define USE_EXPENSIVE_CHECKS_VALUE true
#else
#define USE_EXPENSIVE_CHECKS_VALUE false
#endif
namespace {
const bool useExpensiveChecks = USE_EXPENSIVE_CHECKS_VALUE;
};
void function()
{
if(useExpensiveChecks == true)
{
// expensive checks
}
}
答案 1 :(得分:2)
除了依赖编译器优化代码外,您可以仅在希望代码运行时为编译器传递一个额外的符号定义:
// some code, which only do sanity check
#ifdef my_symbol
expensive checks
#endif
// sanity check end
答案 2 :(得分:2)
在预处理器中使用宏和条件实际上是避免编译器生成代码的唯一方法。
所以,我会这样做:
#ifdef NEED_EXPENSIVE_CHECKS
inline expensive_checking(params...)
{
... do expensive checking here ...
}
#else
inline expensive_checking(params...)
{
}
#endif
然后打电话:
some code
expensive_checking(some_parameters...)
some other code
空内联函数将在任何体面的现代编译器中产生“无代码”。在调试版本设置中使用-DNEED_EXPENSIVE_CHECKS
,不要在发布版本中使用它。
我也知道使用宏和函数的组合,例如:
#ifdef NEED_EXPENSIVE_CHECKS
#define EXPENSIVE_CHECKS(stuff...) expensive_checks(__FILE__, __LINE__, stuff...)
inline expensive_checks(const char *file, int line, stuff ...)
{
if (some_checking)
{
cerr << "Error, some_checking failed at " << file << ":" << line << endl;
}
}
#else
#define EXPENSIVE_CHECKS(stuff...)
#endif
现在,您可以获得有关哪些文件以及某些内容失败时的哪一行的信息,如果在许多地方进行检查,这可能非常有用(并且您可以使用__function__
或__pretty_function__
来获取功能名称,如果你愿意的话)。
显然,assert()
宏基本上会做我的宏解决方案所做的事情,除了它通常不提供文件名和行号。
答案 3 :(得分:1)
将支票移至其他功能,然后导入cassert并写入assert(expensive_check())
。如果要禁用检查,请在包含cassert之前使用#define NDEBUG
。