避免警告:未引用的find_rule标签

时间:2012-01-11 09:01:58

标签: c bison flex-lexer

为了在flex和其他版本的lex之间获得更多兼容性,我们应该在flex命令中添加-l选项。 其中一个不兼容性是yylineno(存储行号的全局变量)。虽然有两种方法可以激活此选项:

  • 使用%选项yylineno

  • 或-l选项

我总是有这样的警告:

  

警告C4102:'find_rule':未引用标签

任何帮助请避免这个警告!

2 个答案:

答案 0 :(得分:1)

根据C4102的说明,原因是未引用的标签:

int f()
{
    test: // This will produce C4102

    return 1;
}

int main()
{
    f();
    return 0;
}

要防止出现警告,您可以删除未使用的标签或通过修改源来禁用警告:

#pragma warning(push)
#pragma warning(disable: 4102)
void f()
{
    test: // This will produce C4102

    return;
}
#pragma warning(pop)

或将/wd4102指定为编译器开关。

正如您所说,这是生成的代码,您不希望更改编译器开关是唯一的选择(我能想到)。

答案 1 :(得分:1)

由于您说触发警告的代码是自动生成的并且无法由您控制,因此摆脱警告的唯一方法是仅针对该代码禁止警告。你有两个选择。

选项一是改变特定文件的编译器设置(不是最好的维护)。

选项2是将。#include .c文件放入另一个文件并将其包装到#pragma warning中:

//WrapperGateFile.c
#pragma warning(push)
#pragma warning(disable: 4102)

#include "ProblematicFile.c"

#pragma warning(pop)

和(重要!)要么不将有问题的.c文件包含到项目中,要么从构建中排除原始的.c文件("从构建"属性中排除),这样它就不会被编译和链接两次