繁体   English   中英

预处理器宏的 G++ 未使用标签警告

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM