C++ ANSI ISO IEC 14882 2003 Phụ lục C.1 (trang 668):vế trái-to-rvalue chuyển đổi của một mảng trong ISO C
Thay đổi: Kết quả của một biểu thức điều kiện, một biểu thức chuyển nhượng, hoặc một dấu phẩy biểu thức có thể đậu lvalue
Lý do: C + + là một ngôn ngữ hướng đối tượng, đặt trọng tâm tương đối nhiều hơn vào giá trị. Ví dụ, các hàm có thể trả về các giá trị.
Ảnh hưởng đến tính năng gốc: Thay đổi thành ngữ nghĩa của tính năng được xác định rõ. Một số biểu thức C dựa hoàn toàn vào các chuyển đổi từ rvalue-to-rvalue sẽ mang lại các kết quả khác nhau. Ví dụ,
char arr[100];
sizeof(0, arr)
mang 100 trong C + + và sizeof(char*)
trong C.
...
Tôi đã đọc bài viết này chỉ ngày hôm nay và tôi nhớ rằng một vài tháng một đi một người bạn của tôi đề xuất một vấn đề wchich là viết một hàm sẽ trả về 0 nếu nó được biên dịch với C++ và 1 nếu nó được biên dịch với C. Tôi đã giải quyết nó lợi dụng thực tế là trong C một struct nằm trong phạm vi bên ngoài. Vì vậy, xem xét thông tin mới này, tôi quyết định rằng đây sẽ là một giải pháp cho vấn đề trên, mà tôi đã thử trên Microsoft Visual Studio 2008, nhưng bất kể nó được biên dịch như mã C hay C++ sizeof(0, arr)
luôn mang lại hiệu suất 4. Vì vậy, 2 câu hỏi:
1. ISO C là gì? Có phải là tiêu chuẩn C hiện tại? Có phải là người duy nhất (tôi nghe C đang phát triển nhanh chóng) 2. Đây có phải là lỗi C++ trên microsoft không?
TIA
Edit: Xin lỗi đã trộn lẫn với đầu ra và chỉnh sửa nó:
Với MSVC 2010, 'sizeof (0, arr)' xuất hiện để đánh giá thành '4' (khi được biên dịch dưới dạng C++). Với g ++, nó đánh giá thành '100'. –