我正在尝试在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'方法。尽管我对almos不了解,但对编码一无所知,这是我找到的唯一答案。任何其他解决方案都欢迎。 谢谢
答案 0 :(得分:1)
好吧,显然在您的实现中,诸如210
和199
之类的值不属于类型char
的范围。因此,转换范围正在缩小。 {}
初始化程序不允许缩小转换范围。
这表明您的实现显然使用了签名的char
类型。
您可以使用char
中的显式强制转换将值强制转换为{}
。您可以停止使用{}
初始化程序。您可以强制实现使用未签名的char
。对于这个问题有很多“解决方案”,但是没有更多的背景,就无法选择一个解决方案。
如果代码最初是为现在要编译的实现的同一“系列”编写的,则很可能是为较旧版本的语言编写的,该版本隐式地执行了缩小转换。在这种情况下,要重现旧的行为,您将需要显式强制转换
char signature[] =
{'%', '%', (char) ('G' + 128), (char) ('R' + 128), (char) ('A' + 128), '\n', 0};
答案 1 :(得分:0)
构建工作最省力的方法可能是在编译器调用中添加-Wno-narrowing
。如果您使用的是make
,则可以使用类似CFLAGS=-Wno-narrowing make
的东西(假设您使用的是bash)来启动效果。
答案 2 :(得分:0)
当前的编译器默认使用较新版本的C ++。您的编译器可能正在尝试以C ++ 11或C ++ 14模式编译源代码。
尝试将-std=c++03
添加到编译器标志中。