Khi tôi biên soạn một cái gì đó giống nhưChuyển nhượng <con trỏ đến mảng các hằng> = <con trỏ đến mảng>: con trỏ tương thích
double da[ 3 ] = { 2., 3., 4. };
double (* pda)[ 3 ] = &da;
double const (* cpda)[ 3 ] = pda; // gcc: warning; MSVC: ok
gcc này cảnh báo tôi
warning: initialization from incompatible pointer type [enabled by default]
Câu hỏi: vấn đề với là gì bài tiểu luận này? Có, về mặt kỹ thuật, đây là những loại khác nhau, nhưng tôi không thấy bất kỳ mối nguy hiểm nào ở đây, double const (*)[ 3 ]
trông thậm chí còn an toàn hơn cho tôi hơn double (*)[ 3 ]
.
tôi đã làm một số xét nghiệm và kết quả nhầm lẫn tôi thậm chí nhiều hơn:
1) MSVC là khá hài lòng với double const (* cpda)[ 3 ] = pda;
chuyển nhượng, không có lỗi, không có cảnh báo.
2) Cả hai gcc và MSVC đang hạnh phúc với điều này
double d = 1.;
double * pd = &d;
double const * cpd = pd; // gcc: ok; MSVC: ok
trong khi đây là những loại khác nhau quá.
3) Trong ví dụ này
double d = 1.;
double * pd = &d;
double * * ppd = &pd;
double const * * cppd = ppd; // gcc: warning; MSVC: error
gcc đưa ra cảnh báo tương tự nhưng MSVC cho lỗi (!).
Ai ở ngay đây? gcc hoặc MSVC?
Kết quả kiểm tra.
Trình biên dịch:
1) gcc phiên bản 4.7.2: http://www.compileonline.com/compile_c_online.php
2) MSVC (như C++ code) phiên bản 'VS2012CTP' 17.00.51025 cho x86: http://rise4fun.com/vcpp
3) MSVC (dưới dạng mã C) VS2010: thử nghiệm ẩn
int main()
{
double d = 1.;
double * pd = &d;
double const * cpd = pd;
// gcc: ok
// MSVC C++: ok
// MSVC C: ok
double * * ppd = &pd;
double const * * cppd = ppd;
// gcc: warning: initialization from incompatible pointer type [enabled by default]
// MSVC C++: error C2440: 'initializing' : cannot convert from 'double **' to 'const double **'
// MSVC C: ok
double da[ 3 ] = { 2., 3., 4. };
double (* pda)[ 3 ] = &da;
double const (* cpda)[ 3 ] = pda;
// gcc: warning: initialization from incompatible pointer type [enabled by default]
// MSVC C++: ok
// MSVC C: ok
cpd, cpda;
return 0;
}
Chỉnh sửa:
Tôi vừa biên soạn điều này trên Visual Studio của tôi dưới dạng mã C (không phải C++) và nó không có lỗi, không có cảnh báo nào cả. Tôi đã chỉnh sửa các bài bình luận ở trên mã số
[Bắt buộc đọc] (http://c-faq.com/ansi/constmismatch.html). –
@ n.m. Cảm ơn, tôi hiểu tại sao nó nguy hiểm – kotlomoy