调试代码和C ++未使用的参数警告

时间:2014-12-12 03:22:10

标签: c++

我已经搜索了C / C +未使用变量警告的解决方案,但没有一个符合我的需要。情况如下:

我正在PC上开发算法,然后将其移植到真正的嵌入式平台。 PC版本将具有在PC的监视器上显示图像的调试代码。遗憾的是,嵌入式平台没有监视器。当然,嵌入式平台根本不需要那些调试代码。

为了区分代码,我们可以这样做:

#ifndef EMBEDED
   MyDebugCode(parameter1, parameter2, parameter3);
#endif

但是,我认为这太糟糕了,因为这些调试函数有很多调用。那些EMBEDED条件会污染代码。相反,我尝试在调试函数中编写条件编译标志,如下所示:

inline void MyDebugCode(type1 p1, type2 p2, type3 p3)
{
#ifndef EMBEDED
     DisplaySomethingOnMonitor(p1, p2, p3);
     ...
     ...
     ...
#endif
}

这样我就可以在函数中编写#ifndef/#ifdef一次,并在没有#ifndef/#ifdef的情况下多次调用它。

现在定义EMBEDED时,我们将使用未使用的变量p1p2p3。这就是问题所在。

此外,我希望在定义inline时,EMBEDDED可以完全优化整个调试功能,就好像它不存在一样。这是次要的。

任何人都有更好的解决方案/做法吗?

请注意,这些参数可以是对类实例的引用。

编译器是g ++

2 个答案:

答案 0 :(得分:1)

一种可能不优雅但常用的方法是使MyDebugCode宏成为不受欢迎的扩展为空的宏。一个简单的例子是:

#ifdef EMBEDDED
#  define MyDebugCode(a,b,c)
#else
inline void MyDebugCode(type1 p1, type2 p2, type3 p3)
{
     DisplaySomethingOnMonitor(p1, p2, p3);
     ...
     ...
     ...
}
#endif

(有些人宁愿让MyDebugCode始终是一个宏,要么什么都不做,要么调用一个可能有不同名称的函数.YMMV。)

答案 1 :(得分:1)

如果您的编译器没有其他方法可以禁用警告,那么这应该有效:

#ifdef EMBEDED
inline void MyDebugCode(type1, type2, type3) {}
#else
inline void MyDebugCode(type1 p1, type2 p2, type3 p3)
{
    DisplaySomethingOnMonitor(p1, p2, p3);
    ...
    ...
    ...
}
#endif

任何合理的编译器都不应警告未使用的未命名参数,因为无法使用它们。