错误:在 { } [-缩小] 中将"199"从"int"到"char&

error: narrowing conversion of ‘199’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]

本文关键字:quot char int 中将 缩小 错误      更新时间:2023-10-16

我正在尝试在 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

我已经尝试了有符号/无符号的"字符"方法。虽然我对编码一无所知,但这是我找到的唯一答案。欢迎任何其他解决方案。 谢谢

好吧,显然在您的实现中,像210199这样的值不适合char类型的范围。因此,转换正在缩小。{}初始值设定项不允许缩小转换范围。

这表明您的实现显然使用带符号的char类型。

您可以通过在{}内使用显式强制转换来强制将值转换为char。您可以停止使用{}初始值设定项。您可以强制实现使用未签名的char。这个问题有很多"解决方案",但没有更多的上下文就没有办法选择一个。

如果代码最初是为你现在编译它的同一个"系列"实现编写的,那么它很可能只是为旧版本的语言编写的,该语言隐式地执行了缩小转换。在这种情况下,要重现旧行为,您需要显式强制转换

char signature[] = 
{'%', '%', (char) ('G' + 128), (char) ('R' + 128), (char) ('A' + 128), 'n', 0};

构建东西最省力的方法可能是在编译器调用中添加-Wno-narrowing。如果您使用的是make,您可能可以使用类似CFLAGS=-Wno-narrowing make的东西(假设您使用的是 bash(来获得所需的效果。

当前编译器默认使用较新版本的C++。编译器可能正在尝试以 C++11 或 C++14 模式编译源代码。

尝试将-std=c++03添加到编译器标志中。