[英]G++ Unused Label Warning for Preprocessor Macro
我正在处理项目中的编译器警告,试图清理代码,让我感到困惑的一个警告/错误是以下代码的unused-label
警告。
STATE(initialize)
它说“初始化”标签已定义但未使用。 STATE
是一个#define
宏,如下所示:
#define STATE(x) x: __TRACE__("enter", #x);
__TRACE__
宏如下:
#define __TRACE__(y,x) dbg.printf(DebugIO::debug2,"FSM:" y "(" x ")\n");
请注意,我没有编写此代码,我只是在完成一个项目,试图纠正尽可能多的警告。 但据我所知, initialize
标签被传递给__TRACE__
,在那里它被用作printf()
调用的参数。
那么,为什么不使用呢? 编译器是否不查看变量使用的预处理器指令?
我将如何纠正这一点?
发出警告的真正原因是
x: TRACE...
介绍要与goto
一起使用的标签。 有理由认为没有goto
来初始化状态(看起来我们正在研究 FSM 实现)。
可能无法在不重新处理框架的情况下删除此警告(例如,添加一个特殊的状态宏,它不会为您从未进入的状态定义标签),但您也可以为项目静音此特定警告.
注意__attribute__((unused))
可以用在 label 上。
将宏参数转换为字符串不算作“使用”碰巧具有相同名称的标签(请记住,标签无论如何都是与变量分开的命名空间,更不用说宏参数了)。
使用(GCC 扩展)一元&&
运算符获取标签的地址也可能会抑制警告,但作为规则,除非您真的知道自己在做什么,否则您应该避免任何看起来像动态goto
内容。 所以更喜欢属性版本。
还要注意__TRACE__
是一个保留名称,因为它包含 2 个相邻的下划线。
据我所知,
initialize
标签被传递给__TRACE__
,在那里它被用作printf()
调用的参数。
不,实际上并非如此。 的x
的参数STATE()
是不一样的x
的参数__TRACE__()
在语句STATE(initialize)
, x
参数是initialize
,所以x:
变成了简单的initialize:
(有问题的标签),但#x
在这种情况下将x
的输入值字符串化为"initialize"
,所以STATE(initialize)
扩展到这个:
initialize: __TRACE__("enter", "initialize");
然后,在__TRACE__
宏中, y
参数是"enter"
, x
参数是"initialize"
,所以__TRACE__("enter", "initialize")
扩展为:
dbg.printf(DebugIO::debug2,"FSM:" "enter" "(" "initialize" ")\n");
最后,仅由空格分隔的字符串文字被编译器合并在一起,因此STATE(initialize)
的最终代码如下所示:
initialize: dbg.printf(DebugIO::debug2,"FSM:enter(initialize)\n");;
并且由于没有引用initialize
标签的goto
或其他语句,这就是您收到有关它的警告的原因。
我将如何纠正这一点?
除非代码中的某处有实际的goto initialize
语句,否则我会完全摆脱标签:
#define STATE(x) __TRACE__("enter", #x);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.