2010-10-17 17 views
6

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ó:

+1

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'. –

Trả lời

1

Hoặc chỉ cần C của microsoft không theo tiêu chuẩn ISO C nhưng một số tiêu chuẩn khác C (nếu có tồn tại).

Microsoft Visual C vẫn hỗ trợ C89 [only] trong khi các trình biên dịch khác như gcc/clang etc support C99 cũng là tiêu chuẩn hiện tại.

C99 [Mục 6.5.17/2] nói

Các toán hạng trái của một nhà điều hành dấu phẩy được đánh giá là một biểu thức còn thiếu; có một điểm chuỗi sau khi đánh giá. Sau đó toán hạng bên phải được đánh giá; kết quả có loại và giá trị của nó.

Do đó, kết quả của sizeof (0,arr) sẽ sizeof(char*) [do tiềm ẩn lvalue-rvalue chuyển đổi/phân rã tự động để loại con trỏ] không 100*sizeof(char)

sizeof(arr) sẽ cho 100*sizeof(char) từ 6.5.3.4/3

95) Toán tử dấu phẩy không mang lại giá trị.


quyết định rằng đây sẽ là một giải pháp cho vấn đề trên, mà tôi đã cố gắng trên Microsoft Visual Studio 2008, nhưng bất kể nó được biên dịch như C hay C++ sizeof (0, arr) luôn sản lượng 4.

C++ 03 [5.18/1] Comma Operator

loại và giá trị của kết quả là những loại và giá trị của toán hạng bên phải; kết quả là một lvalue nếu toán hạng bên phải của nó là.

Vì vậy, sizeof(0, arr) = sizeof (arr) và số này sẽ bằng 100* sizeof(char) và không = sizeof(char*).

Vì vậy, MSVC++ đưa ra kết quả không chính xác (trong trường hợp mã C++).

+0

@Prasoon: 95) có đề cập đến C hoặc C++ không? –

+0

@Armen: 'C99' [..] Đã chỉnh sửa bài đăng của tôi để rõ ràng. –

+0

Đôi khi tôi tự hỏi tại sao tôi vẫn đang sử dụng MSVC. Nhưng sau đó họ có một IDE tuyệt vời ... –

5

ISO C là tiêu chuẩn C. Cái hiện tại là C99 nhưng C1x nằm ngay góc. Nếu bằng cách nhanh chóng, bạn có nghĩa là một tiêu chuẩn mới mỗi thập kỷ hoặc lâu hơn, sau đó có, nó đang nhanh chóng phát triển :-)

Mục 6.5.3.4/3 ISO C99 khẳng định:

Khi áp dụng cho một toán hạng có loại char, unsigned char hoặc char đã ký, (hoặc phiên bản đủ điều kiện) kết quả là 1.

Khi áp dụng cho toán hạng có loại mảng, kết quả là tổng số byte trong mảng .

0

Đối với mảng, sizeof trả về tổng kích thước. Hãy cẩn thận về mảng được truyền dưới dạng con trỏ.

C99 tiêu chuẩn:

Khi áp dụng cho một toán hạng có mảng loại, kết quả là tổng số byte trong mảng

Các vấn đề liên quan