2013-05-03 76 views
-1

我有一段代码:C++编译器力退出一些一段代码

// some code, which only do sanity check 
expensive checks 
// sanity check end 

现在我该怎样告诉编译器,迫使它退出 这一块?基本上这意味着当我用-O2或 O3编译时,我不希望它在那里...

谢谢!

回答

2

而不是依赖于编译器进行优化的代码,你可以通过编译器的附加符号定义,只有当你想要的代码运行:

// some code, which only do sanity check 
#ifdef my_symbol 
expensive checks 
#endif 
// sanity check end 
+0

那么,有没有更好的方法来做到这一点?我知道我可以通过一些国旗来控制这一点,但这真的不是我想要的 – WhatABeautifulWorld 2013-05-03 21:15:31

+2

@WhatABeautifulWorld,你认为什么是“更好的方式”? – 2013-05-03 21:47:57

+1

@WhatABeautifulWorld所以你期望编译器读取你的想法?显然你必须指定一些东西来告诉编译器它应该做什么,并且在一个地方(makefile)这样做似乎对我来说非常接近最优。 – Voo 2013-05-06 03:07:24

1

移动你的支票兑换成不同的功能,然后导入cassert并编写assert(expensive_check())。当您要禁用检查时,请在之前使用#define NDEBUG包含cassert。

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 
    } 
} 
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__或​​获取函数名称)。

很明显,assert()宏将基本上做我的宏解决方案,除了它通常不提供文件名和行号。