错误:在 [-Wnarrowing] 中缩小从“int”到“char”的“199”转换
Posted
技术标签:
【中文标题】错误:在 [-Wnarrowing] 中缩小从“int”到“char”的“199”转换【英文标题】:error: narrowing conversion of ‘199’ from ‘int’ to ‘char’ inside [-Wnarrowing]错误:在 [-Wnarrowing] 中缩小从“int”到“char”的“199”转换 【发布时间】:2018-08-15 15:39:17 【问题描述】:我正在尝试在 linux debian 9.5 中编译一个非常旧的软件,我不断收到此错误:
janpdf/PDF.cpp: In member function ‘void PDF::OpenFile(const char*)’:
janpdf/PDF.cpp:41:74: error: narrowing conversion of ‘199’ from ‘int’ to
‘char’ inside [-Wnarrowing]
char signature[] = '%', '%', 'G' + 128, 'R' + 128, 'A' + 128, '\n', 0;
^
janpdf/PDF.cpp:41:74: error: narrowing conversion of ‘210’ from ‘int’ to
‘char’ inside [-Wnarrowing]
janpdf/PDF.cpp:41:74: error: narrowing conversion of ‘193’ from ‘int’ to
‘char’ inside [-Wnarrowing]
Makefile:153: recipe for target 'janpdf/PDF.o' failed
make: *** [janpdf/PDF.o] Error 1
我已经尝试过签名/未签名的'char'方法。尽管我对编码几乎一无所知,但这是我找到的唯一答案。欢迎任何其他解决方案。 谢谢
【问题讨论】:
Achar
可以是有符号的或无符号的——实现定义。如果已签名,则 199
将不适合。似乎您的实现使用签名字符。
【参考方案1】:
好吧,显然在您的实现值中,例如 210
和 199
不适合 char
类型的范围。因此,转换正在缩小。 初始化器不允许缩小转换。
这表明您的实现显然使用签名的char
类型。
您可以通过在 中使用显式强制转换将值强制转换为
char
。您可以停止使用 初始化程序。您可以强制您的实现使用未签名的
char
。这个问题有很多“解决方案”,但是没有更多的上下文就没有办法选择一个。
如果代码最初是为您现在正在编译的同一“系列”实现编写的,那么很可能它只是为该语言的旧版本编写的,它隐式地执行了缩小转换。在这种情况下,要重现旧行为,您需要显式强制转换
char signature[] =
'%', '%', (char) ('G' + 128), (char) ('R' + 128), (char) ('A' + 128), '\n', 0;
【讨论】:
看起来他只是想编译一些用旧版语言编写的依赖项。根据它的大小,编辑源代码可能不是一个可行的策略。 最省力的编辑是将128
更改为 -128
- 生成的按位模式将符合预期,并且值将适合带符号的字符;或者将 char 改为 unsigned char,这可能会产生其他后果。【参考方案2】:
构建你的东西最省力的方法可能是将-Wno-narrowing
添加到你的编译器调用中。如果您使用的是make
,您可能可以使用CFLAGS=-Wno-narrowing make
之类的方式启动它(假设您使用的是 bash)来获得所需的效果。
【讨论】:
我不建议只禁用错误并继续使用 C++11(或 C++14)。在这些版本的语言中引入的一些结构的含义发生了细微的变化,这些变化可能会导致无声的错误。 我在制作 wxGTK-2.8.12 时遇到了几乎相同的警告/错误。根据来自 ***.com/questions/20302595/… 的 Ben 的回答,我通过在 MakeFile 中的 CFLAGES var 中添加“-Wno-c++11-narrowing”成功地构建了文件【参考方案3】:当前编译器默认使用较新版本的 C++。您的编译器可能正在尝试以 C++11 或 C++14 模式编译源代码。
尝试将-std=c++03
添加到您的编译器标志中。
【讨论】:
以上是关于错误:在 [-Wnarrowing] 中缩小从“int”到“char”的“199”转换的主要内容,如果未能解决你的问题,请参考以下文章
如果在三元运算符中使用局部变量,为啥从 int 到 short 的缩小转换不起作用