Tôi có một dự án C++ mà tôi biên dịch cả bằng cách sử dụng g++
trên máy của mình (biên dịch thành "máy chủ") và bộ xử lý ARM sử dụng trình biên dịch chéo (trong trường hợp của tôi là arm-cortex_a8-linux-gnueabi-g++
). Tôi đang trong quá trình chuyển đổi sang C++ 0x/11 standart và có một lỗi tôi nhận được khi biên soạn danh sách khởi tạo, mà tôi đã có thể sinh sản trong đoạn mã sau:"Thu hẹp chuyển đổi từ 'int' thành 'char' bên trong {}" cho các giá trị pháp lý khi biên dịch
int main(void) {
char c[1] = {-108};
}
Chương trình này là dường như đúng như -108
là một giá trị pháp lý cho một char
. Biên dịch này với g++
mang lại không có lỗi với dòng lệnh sau đây:
g++ example.cc -std=c++0x
Tuy nhiên, khi tôi biên dịch với cross-biên dịch, như vậy:
arm-cortex_a8-linux-gnueabi-g++ example.cc -std=c++0x
tôi nhận được lỗi sau:
example.cc: In function 'int main()':
example.cc:2:22: error: narrowing conversion of '-0x0000000000000006c' from 'int' to 'char' inside { } [-fpermissive]
Kể từ khi giá trị pháp lý, điều này có vẻ như một lỗi. Bạn có thể giải thích tại sao tôi nhận được lỗi này và phải làm gì để giải quyết nó?
Chỉnh sửa: lưu ý rằng việc sử dụng giá trị dương (ví dụ: 108
) là hợp pháp và không dẫn đến lỗi trên cả hai trình biên dịch.
'char' có thể là unsigned trên nền tảng mục tiêu. Bạn có thể kiểm tra? – Brian
@Brian, làm cách nào để kiểm tra? –
@AndyThomas 'std :: is_signed '? Hoặc, rỉ sét, 'char (-1) <'\ 0'' –
Columbo