c++ 强制编译器选择退出某些代码

问题描述 投票:0回答:4

我有一段代码:

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

现在我如何告诉编译器强制它选择退出 这件作品?基本上这意味着当我使用 -O2 或 O3,我不想让它在那里……

c++ optimization
4个回答
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
投票

您可以仅在希望代码运行时向编译器传递附加符号定义,而不是依赖编译器来优化代码:

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

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()
宏基本上会做我的宏解决方案所做的事情,只是它通常不提供文件名和行号。


1
投票

将支票移至不同的函数中,然后导入 cassert 并写入

assert(expensive_check())
。当您想要禁用检查时,请在包含 cassert 之前使用
#define NDEBUG

© www.soinside.com 2019 - 2024. All rights reserved.