我有一个 C++ 项目,我在我的机器上使用 g++
编译(编译到“主机”)和使用交叉编译器编译到 ARM 处理器(在我的例子中是 arm-cortex_a8-linux-gnueabi-g++
)。我正在转换为 C++0x/11 标准,编译初始化列表时出现错误,我能够在以下代码段中重现该错误:
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
)是合法的,不会导致两个编译器出错。
原文由 Andy Thomas 发布,翻译遵循 CC BY-SA 4.0 许可协议
当您将变量声明为
char
时,它是有符号还是无符号取决于实现。如果您需要能够存储负值,您应该明确声明它signed
,而不是依赖于实现定义的默认值。