【问题标题】:How do I use a macro to redefine a function in release mode?如何在发布模式下使用宏重新定义函数?
【发布时间】:2012-07-10 03:16:55
【问题描述】:

使用 C++,我需要一个宏来替换在发布模式下运行的函数以不执行任何操作。因此,在调试模式下,该函数将被执行,但在发布模式下则不会。

类似这样的:

static void foo(int,int)

#ifdef NDEBUG
#define foo(x,y)
#endif

...函数体在单独的 .cpp 文件中定义,并且是类的一部分,这就是为什么我认为这不起作用?

实际代码..

标题

static void ValidateInput(const SeriesID *CurrentSeries, const AEnum_TT_TICK_ROUND& roundType = TT_TICK_ROUND_NONE);

.cpp

void TTBaseTick::ValidateInput(const SeriesID *CurrentSeries, const AEnum_TT_TICK_ROUND& roundType)
{
#ifndef _DEBUG
if (!CurrentSeries)
{
  throw TTTick::Ex(TTTick::SeriesNull);
}
else if (CurrentSeries->precision <= 0)
{
    throw TTTick::Ex(TTTick::PrecisionInvalid);
}
else if(!roundType.IsValidValue(roundType))
{
    throw TTTick::Ex(TTTick::InvalidParam);
}
#endif
}

【问题讨论】:

  • 为什么不能对 .cpp 文件中的函数定义本身这样做?
  • foo 是在其他地方声明的类的静态成员函数吗?
  • 神秘 - 我得到一个没有生成目标文件的错误 H3nr1x - 不,它只在这个类中声明

标签: c++ visual-c++ macros


【解决方案1】:
static void foo(int,int); // declaration



// Definition in your cpp file.
void foo( int x, int y )
{
#ifndef NDEBUG
    // Code for debug mode
#endif
}

【讨论】:

  • 这不起作用,因为我得到一个错误,没有生成目标文件
  • @user1513555 对我来说工作正常。可能是其他问题。你能把代码贴在你使用它的地方吗?
  • 发表在原帖中,我想可能是因为数据类型实际上不是整数?
  • @Bullsfan127 AEnum_TT_TICK_ROUND 是枚举吗?
  • 是的,它是一个编译时敏捷枚举
【解决方案2】:
static void foo_(int, int);

#ifdef NDEBUG
#define foo(x,y)
#else
#define foo(x,y)   foo_(x,y)
#endif

【讨论】:

  • 如果他能改变函数,他还不如把条件编译放在它的实现中,跳过所有引入的函数式宏的问题。
  • 是的,我不能更改函数或其名称,只是希望它在不调试时基本跳过函数调用。优化代码
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多