2010-05-24 14 views
16

Trong phần bao gồm setlocale, tiêu chuẩn ANSI C nêu trong chú thích rằng các hàm duy nhất ctype.h có hành vi không bị ảnh hưởng bởi ngôn ngữ hiện tại là isdigit và isxdigit.Có thể isdigit hợp pháp là ngôn ngữ phụ thuộc vào C

Việc triển khai Microsoft isdigit phụ thuộc vào ngôn ngữ bởi vì, ví dụ: bằng ngôn ngữ sử dụng trang 1250 isdigit chỉ trả về khác 0 cho các ký tự trong phạm vi 0x30 ('0') - 0x39 ('9'). các ngôn ngữ sử dụng trang mã 1252 isdigit cũng trả về khác 0 cho các chữ số 0xB2 ('²'), 0xB3 ('³') và 0xB9 ('¹').

Microsoft có vi phạm tiêu chuẩn C bằng cách đặt phụ thuộc vào ngôn ngữ isdigit không?

Trong câu hỏi này, tôi chủ yếu quan tâm đến C90, mà Microsoft tuyên bố tuân theo, thay vì C99.

nền khác: tài liệu riêng

của Microsoft setlocale sai khẳng định rằng isdigit không bị ảnh hưởng bởi phần LC_CTYPE của miền địa phương.

Phần của chuẩn C bao gồm các chức năng ctype.h chứa một số từ ngữ mà tôi xem xét mơ hồ:

Hành vi của các chức năng này bị ảnh hưởng bởi locale hiện hành. Những chức năng đó chỉ có các khía cạnh cụ thể về miền địa phương khi không có ngôn ngữ "C" được ghi chú bên dưới.

Tôi xem xét điều này mơ hồ vì không rõ những gì nó đang cố gắng nói về các chức năng như isdigit mà không có ghi chú về khía cạnh địa phương cụ thể. Nó có thể là cố gắng để nói rằng các chức năng như vậy phải được giả định là phụ thuộc vào miền địa phương, trong trường hợp của Microsoft thực hiện isdigit sẽ là OK. (Ngoại trừ chú thích mà tôi đã đề cập trước đó dường như mâu thuẫn với cách giải thích này.)

Trả lời

6
  1. Microsoft luôn đúng.
  2. Nếu Microsoft không thấy đúng mục 1

Microsoft luôn có giải thích riêng về thông số. Và thường là câu: "Nhưng Microsoft sai", không mang trọng lượng với CEO của bạn, vì vậy bạn phải viết mã xung quanh các lỗi/giải thích MS.

Số lượng mã để hỗ trợ hành vi không chính xác của IE và Outlook đáng kinh ngạc.

Trong nhiều trường hợp, giải pháp duy nhất là để tung ra phiên bản riêng của bạn về chức năng mà không được điều đúng đắn và làm điều gì đó như thế này:

int my_isdigit(int c) 
{ 
#ifdef WIN32 
    your implementation goes here 
#else 
    return isdigit(c); 
#endif 
} 
+1

+1 cho suy nghĩ rất thực tế :) –

4

Các bộ ký tự yêu cầu được quy định tại mục 2.2.1 . Mục 2.2.1.2 sau đó tiếp tục mô tả hành vi của các ký tự mở rộng:

  • Các ký tự một byte được xác định trong $ 2.2.1 phải có mặt.
  • Sự hiện diện, ý nghĩa và đại diện của bất kỳ thành viên bổ sung nào là địa phương cụ thể.