我有一段代码:C++编译器力退出一些一段代码
// some code, which only do sanity check
expensive checks
// sanity check end
现在我该怎样告诉编译器,迫使它退出 这一块?基本上这意味着当我用-O2或 O3编译时,我不希望它在那里...
谢谢!
我有一段代码:C++编译器力退出一些一段代码
// some code, which only do sanity check
expensive checks
// sanity check end
现在我该怎样告诉编译器,迫使它退出 这一块?基本上这意味着当我用-O2或 O3编译时,我不希望它在那里...
谢谢!
而不是依赖于编译器进行优化的代码,你可以通过编译器的附加符号定义,只有当你想要的代码运行:
// some code, which only do sanity check
#ifdef my_symbol
expensive checks
#endif
// sanity check end
移动你的支票兑换成不同的功能,然后导入cassert并编写assert(expensive_check())
。当您要禁用检查时,请在之前使用#define NDEBUG
包含cassert。
您可以使用常量和单个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
}
}
在预处理器中使用宏和条件是真正避免编译器生成代码的唯一方法。
所以,这里是我会怎么做:
#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__
或获取函数名称)。
很明显,assert()
宏将基本上做我的宏解决方案,除了它通常不提供文件名和行号。
那么,有没有更好的方法来做到这一点?我知道我可以通过一些国旗来控制这一点,但这真的不是我想要的 – WhatABeautifulWorld 2013-05-03 21:15:31
@WhatABeautifulWorld,你认为什么是“更好的方式”? – 2013-05-03 21:47:57
@WhatABeautifulWorld所以你期望编译器读取你的想法?显然你必须指定一些东西来告诉编译器它应该做什么,并且在一个地方(makefile)这样做似乎对我来说非常接近最优。 – Voo 2013-05-06 03:07:24