我已经搜索了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
时,我们将使用未使用的变量p1
,p2
和p3
。这就是问题所在。
此外,我希望在定义inline
时,EMBEDDED
可以完全优化整个调试功能,就好像它不存在一样。这是次要的。
任何人都有更好的解决方案/做法吗?
请注意,这些参数可以是对类实例的引用。
编译器是g ++
答案 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
任何合理的编译器都不应警告未使用的未命名参数,因为无法使用它们。