gpt4 book ai didi

c - 当使用 -Wsign-compare 编译生成的扫描器时,yyless 触发签名比较警告

转载 作者:太空宇宙 更新时间:2023-11-04 08:16:08 25 4
gpt4 key购买 nike

我在使用我的 lex (flex 2.6.0) 扫描器规则时遇到问题,它看起来像:

. {
/* Place the char back and process statment normally. */
yyless(0);
yycolumn--;
BEGIN(CONDITION_NORMAL);
}

问题来自扩展为的宏 yyless(0):

do {
int yyl;
for ( yyl = n; yyl < yyleng; ++yyl )
if ( yytext[yyl] == '\n' )
--yylineno;
}while(0)

问题在于 yyleng 是无符号类型。在项目中我正在努力,我们有 gcc 编译器标志来转换警告错误,以便标记/未签名比较警告并我在编译时遇到错误。

有谁知道 lex 是否有办法覆盖宏或改变类型(yyleng 到 int)?

编辑:(澄清)我们需要一个解决方案,在 Lex 创建文件后无论如何都不会修改生成的文件。当然,我可以在生成的文件中添加强制转换,但如果有人更改了词法分析器,那将在将来造成麻烦。

最佳答案

flex 维护者的官方政策是不支持-Werror。 (我引用:“...编译器的警告不是 flex 的错误。特别是,“gcc -Werror”可能会失败。”)

尽管如此,我对这个错误报告表示同情,并已将其归档 ( https://sourceforge.net/p/flex/bugs/201/ )

最简单的修复方法是将该错误报告中的补丁应用到您的 flex 副本并重建它。如果您的软件分发方法是分发生成的文件,那么(加上关于该问题的注释)就足够了,尽管我同意这并不理想。

如果您想要一个丑陋的解决方法,您可以尝试在编译生成的扫描仪文件时将 -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=ssize_t 添加到编译器标志中。我没试过;如果你这样做了但它不起作用,请告诉我。 (我认为将 yy_size_t 设为带符号的类型是不正确的,但它可能会消除警告,而且应该不会造成伤害。)

关于c - 当使用 -Wsign-compare 编译生成的扫描器时,yyless 触发签名比较警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35689072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com