首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:在{} [-Wnarrowing]中将‘199’从‘int’转换为‘char’

错误:在{} [-Wnarrowing]中将‘199’从‘int’转换为‘char’
EN

Stack Overflow用户
提问于 2018-08-15 15:39:17
回答 3查看 8.8K关注 0票数 1

我试图在LinuxDebian9.5中编译一个非常老的软件,我一直收到这个错误:

代码语言:javascript
复制
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”方法。虽然我对编码一无所知,但这是我找到的唯一答案。欢迎使用其他解决方案。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-15 15:56:51

让您的东西构建的最低努力方式可能是将-Wno-narrowing添加到编译器调用中。如果您使用的是make,那么您可能可以使用类似于CFLAGS=-Wno-narrowing make (假设您使用bash)的东西来获得所需的效果。

票数 1
EN

Stack Overflow用户

发布于 2018-08-15 15:42:57

显然,在您的实现中,像210199这样的值不符合char类型的范围。因此,转换正在缩小。{}初始化器不允许收缩转换。

这表明您的实现显然使用了签名的char类型。

通过在char中使用显式强制转换,可以强制将值转换为{}。您可以停止使用{}初始化器。您可以强制您的实现使用未签名的char。对于这个问题有很多“解决方案”,但是没有更多的上下文就无法选择其中的一个。

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

代码语言:javascript
复制
char signature[] = 
  {'%', '%', (char) ('G' + 128), (char) ('R' + 128), (char) ('A' + 128), '\n', 0};
票数 3
EN

Stack Overflow用户

发布于 2018-08-15 15:58:13

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51861932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档