如何在发布模式下使用宏重新定义函数?

Posted

技术标签:

【中文标题】如何在发布模式下使用宏重新定义函数?【英文标题】: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 - 不,它只在这个类中声明 【参考方案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

【讨论】:

如果他能改变函数,他还不如把条件编译放在它的实现中,跳过所有引入的函数式宏的问题。 是的,我不能更改函数或其名称,只是希望它在不调试时基本跳过函数调用。优化代码

以上是关于如何在发布模式下使用宏重新定义函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看xcode下已经预先定义好的宏

如何判断代码运行在DEBUG还是RELEASE模式下

EXCEL宏如何让自定义函数返回错误代码?

如何在单独的 .asm 文件中定义子程序/宏?

如何从用户定义的包中正确导入宏?

宏定义及调用