我有一个 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
)是合法的,不会导致两个编译器都出错。
最佳答案
当您将变量声明为 char
时,无论它是有符号还是无符号,都取决于实现。如果您需要能够存储负值,则应显式声明 signed
,而不是依赖实现定义的默认值。
signed char c[1] = { -108 };
关于c++ - "Narrowing conversion from ' int ' to ' char ' inside { }"交叉编译时的合法值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31634962/