Đây là một mã -chuyển đổi không hợp lệ từ unsigned char * để char *
1 int main(int argc, char *argv[])
2 {
3 signed char S, *psc;
4 unsigned char U, *pusc;
5 char C, *pc;
6
7 C = S;
8 C = U;
9
10 pc = psc;
11 pc = pusc;
12
13 return 0;
14 }
$ gcc test.cpp -o a
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]
này được biên soạn trên phiên bản gcc 4.6.3 trên Ubuntu 12.10 trên một máy Intel 32-bit.
Xét rằng char
loại là unsigned char
trên x86. -
Nếu bài tập trên dòng 7 và 8 cho loại không phải con trỏ là Ok, tại sao lỗi được ném cho loại con trỏ trên dòng 10 và 11?
Ngoài ra, nên C = U
thành công mà không yêu cầu dàn diễn viên?
Bạn có quen thuộc với thuật ngữ ["bí danh nghiêm ngặt"] không (http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html)? – WhozCraig
Đọc nội dung đó ... – nightlytrails
'-fpermissive' có thể giúp bạn và bỏ qua sự khó chịu này. Đôi khi bạn có thể muốn tạm thời xóa thẻ và xem liệu trình biên dịch của bạn có phát hiện các lỗi khác so với lỗi này trong dự án của bạn mà bạn * nên lo lắng không. – rsethc