【发布时间】:2015-10-16 13:38:34
【问题描述】:
我有一个 C++ 项目,我在我的机器上使用 g++ 编译(编译到“主机”)和使用交叉编译器(在我的情况下为 arm-cortex_a8-linux-gnueabi-g++)编译到 ARM 处理器。我正在转换为 C++0x/11 标准,编译初始化列表时出现错误,我能够在以下 sn-p 中重现该错误:
int main(void) {
char c[1] = {-108};
}
这个程序看起来是正确的,因为-108 是char 的合法值。
使用g++ 编译它不会产生以下命令行错误:
g++ example.cc -std=c++0x
但是,当我使用交叉编译器进行编译时,如下所示:
arm-cortex_a8-linux-gnueabi-g++ example.cc -std=c++0x
我收到以下错误:
example.cc: In function 'int main()':
example.cc:2:22: error: narrowing conversion of '-0x0000000000000006c' from 'int' to 'char' inside { } [-fpermissive]
由于值是合法的,这似乎是一个错误。你能解释一下为什么我会收到这个错误以及如何解决它吗?
编辑:请注意,使用正值(例如,108)是合法的,不会导致两个编译器都出错。
【问题讨论】:
-
char可能在目标平台上未签名。可以查一下吗? -
@Brian,我该如何检查?
-
@AndyThomas
std::is_signed<char>?或者,简单地说,char(-1) < '\0' -
108是否也遇到同样的错误?此外,c++0x 的早期 GCC 实现对缩小转换非常严格。也许您的交叉编译器就是其中之一。毕竟,它是从int到char的缩小转换。 -
@Barmar 使用
signed char工作!把它写成答案,我会接受的。
标签: c++ linux c++11 cross-compiling