是否可以创建一个不会产生警告的空函数?

时间:2010-03-17 20:38:29

标签: c++ gcc g++

我在c ++应用程序中有一个记录器,它使用如下定义:

#define FINEST(...) Logger::Log(FINEST, _FILE, __LINE, __func, __VA_ARGS_)

然而,我想要做的是能够关闭这些日志,因为它们对我的系统有严重的性能影响。并且,仅仅让我的Logger不写入系统日志是不够的。我真的需要摆脱日志产生的代码。

为了做到这一点,我将定义更改为:

#define FINEST(...)

哪个有效,但这会在我的代码中产生一大堆警告,因为变量现在未被使用。所以我想要的是一种实际上不存在的NULL FUNCTION,但不会对未使用的变量产生警告。

所以,换句话说,我希望它能在没有警告的情况下进行编译(即编译器认为变量用于函数),但该函数实际上并不存在于应用程序中(即不会产生性能损失)。

这可能吗?

谢谢!

5 个答案:

答案 0 :(得分:4)

您是否考虑过关闭编译器的特定警告? 这可能不是一个好主意,但如果你需要一个快速而肮脏的解决方案......

答案 1 :(得分:3)

template<bool implemented>
void Logger::Log( ... );

template<>
void Logger::Log<true>( ... )
{
  // with implementation
}

template<>
void Logger::Log<false>( ... )
{
  // without implementation
}

// USE:
#define FINEST(...) Logger::Log<true>(FINEST, _FILE, __LINE, __func, __VA_ARGS_)
// or
#define FINEST(...) Logger::Log<false>(FINEST, _FILE, __LINE, __func, __VA_ARGS_)

// EVEN BETTER (w/o macro):
// flag to switch on/off logging
const bool with_log = true; // or =false

// use   
Logger::Log<with_log>( /* place arguments here */ );

答案 2 :(得分:3)

您可以使用未命名的参数定义一个空函数:

void nullFunc(int, int, int, const char*, ...) {
}

然后重新定义您的宏以调用此函数:

#define FINEST(...) nullFunc(FINEST, _FILE, __LINE, __func, __VA_ARGS_)

答案 3 :(得分:3)

在comeau和GCC上,如果将变量包装到sizeof中,警告就会消失:

#define FINEST(...) ((void)sizeof(__VA_ARGS__))

为了避免GCC上关于逗号运算符的左侧或右侧没有效果的警告(例如,如果它扩展为sizeof(a, b)),您可以引入具有其自己的逗号运算符的debug-nullify类型:

struct debug_nullify { };

// doesn't need a definition
template<typename T>
debug_nullify operator,(debug_nullify, T const &);

#define FINEST(...) ((void)sizeof(debug_nullify(), __VA_ARGS__))

sizeof的好处是不评估参数表达式。

答案 4 :(得分:2)

我建议在发行版中删除声明

int somefunc(int foo, int bar, void* baz)
    {
    DEBUGVAR(Logger,log);
    int othervar;
    /* stuff */
    MAYBELOG(log,"something happened: %i",othervar);
    /* other stuff */
    return 0;
    }

in define:

#if DEBUGLEVEL>0
#define DEBUGVAR(type,...) type __VA_ARGS__
#define MAYBELOG(logger,str,...) logstuff(logger,__FLIE__,__LINE__,str,__VA_ARG__)
#else
#define DEBUGVAR(type,...)
#define MAYBELOG(logger,str,...)
#endif