Khác biệt giữa bản sửa đổi của “Thư viện chuẩn C”

Nội dung được xóa Nội dung được thêm vào
Không có tóm lược sửa đổi
Không có tóm lược sửa đổi
Dòng 1:
'''Thư viện chuẩn C''' nàyngày nay là một tập hợp của các [[tập tin tiêu đề]] và [[thư viện (khoa học máy tính)|thư viện]] các thủ tục được tiêu chuẩn hóa dùng để thiết lập các pháp toán tổng quát, như là việc xử lí [[I/O]] và [[dãy kí tự]] trong [[C (ngôn ngữ lập trình)|C]]. Khác với [[Pascal (ngôn ngữ lập trình)|Pascal]] hay [[PL/I]], C không bao hàm sẵn các [[từ khoá]] để dùng cho tác thao tác, và như vậy, hầu như mọi chương trình C đều phụ thuọcthuộc vào thư viện chuẩn để hoạt động .
 
== Thiết kế ==
 
== Thiết kế ==
:''Trong cả bài viết này chữ "tiêu đề" sẽ được hiểu nghĩa là "tập tin tiêu đề".''
 
Tên và đặc tính của mỗi hàm trong C được chứa trong một tập tin gọi là [[tập tin tiêu dề]] nhưng sự kiến tạo thực sự của các hàm này đuợc phân chia vào trong các [[thư viện (khoa học máy tính)|tập tin thư viện]]. Tên và nội hàm của các tiêu đề đã trở nên thông dụng nhưng tổ chức của các thư viện này vẩn còn phân hoá. Thư viện chuẩn thừong đựoc ban hành chung với một [[trình dịch]]. Vì các trình dịch C thường hay cung cấp thêm các chức năng không có trong tiêu chuẩn [[ANSI C]], nên một thư viện chuẩn của một trình dịch đặc thù hầu như sẽ không tương thích với các thư viện chuẩn của trình dịch khác.
 
Nhiều phần thư viện chuẩn C cho thấy việc thiết kế chúng rất tốt. Tuy nhiên, một số ít, Chocho thấy điểm yếu sau khi dược dùng rộng rãi như là hàm đọc từ đầu vào <code>gets()</code> (và cũng như hàm <code>scanf()</code> đọc dãy kí tự từ đầu vào) là một nguyên nhân của nhiều lỗi kiểu <code>[[buffer overflow]]</code>, và hầu hết các sách hướng dẫn đều khuyến cáo tránh dùng chúng. Một khuyết điểm nữa là hàm <code>strtok()</code> được thiết kế như là một [[phân tích từ điển]] cơ bản nhưng rất khó dùng và dể bị hỏng.
 
== Lịch sử ==
Trước khi đuợc tiêu chuẩn hoá, [[ngôn ngữ C]] đã không cung cấp các hàm nội tại chẳng hạn là các phép toán I/O (không giống với các ngôn ngữ truyền thống như [[Pascal]] và [[Fortran]]). Theo thời gian, người trong cộng đồng của C đã chia sẻ nhau các ý tưởng và xây dựng nên cái mà ngày nay ta gọi là '''thư viện chuẩn C''' để cung ứng các chức năng. Nhiều ý kiến trong đó, đã được dùng vào việc định nghĩa của ngôn ngữ lập trình tiêu chuẩn hóa C.
 
[[Unix]] và C đều đã được tạo ra ở [[Bell Labs]] vào cuối [[thập niên 1960]] đầu [[thập niên 1970]]. Trong suốt những năm của [[thập niên 1970]], C trở nên phổ biến. Nhiều đại học và tổ chức bắt đầu tạo ra các ngôn ngữ C riêng cho các đề án của họ. Đến đầu [[thập niên 1980]], vấn đề tương thích giữa những sự kiến tạo về C đã trở nên nghiêm túc. Năm [[1983]], [[ANSI]] thành lập một hội đồng để hoàn tất đặc tả tiêu chuẩn cho C gọi là "ANSI C". Công việc này dẫn tới sự hình thành của cái gọi là chuẩn "C89" trong năm [[1989]]. Một bộ phận của kết quả chuẩn này là một tập họp của các [[thư viện phần mềm]] gọi là '''thư viện chuẩn ANSI C ''' đã ra đời.
 
Phiên bản viết lại sau này của chuẩn C đã thêm vào nhiều tập tin tiêu đề cần thiết cho thư viện. HổHỗ trợ cho nhiều sự mở rộng khác nhau giữa các sư thiết lập (của C).
 
<div id="NA1">Các tiêu đề '''<iso646.h>''', '''<wchar.h>''', và '''<wctype.h>''' đã được thêm vào với Tu chính chuẩn số 1 (''Normative Amendment'') đưược viết tắt là '''NA1''', và được chuẩn C chấp thuận vào nằmnăm [[1995]].</div>
 
Các tiêu đề '''<complex.h>''', '''<fenv.h>''', '''<inttypes.h>''', '''<stdbool.h>''', '''<stdint.h>''', và '''<tgmath.h>''' đã được thêm vào một phiên bản mới của chuẩn C là '''C99''', phát hành năm [[1999]].
 
== Chuẩn ANSI ==
 
== Chuẩn ANSI ==
Thư viện chuẩn ANSI bap gồm 24 tiêu đề C mà có thể được bao gồm trong một đề án của người lập trình với các chỉ thị (dịch). Mỗi tiêu đề chứa một hay nhiều sự khai báo của hàm, sự định nghĩa của kiểu dữ liệu và các macro. Nội dung của các tiêu đề như sau:
 
Thư viện chuẩn thì không đuợc viết hoa. Nó cung cấp tập hợp cơ bản các hàm toán, điều chỉnh dãy kí tự, chuyển đổi kiểu, và các I/O cơ sở. Nó không bao gồm một tập hợp chuẩn các "kiểu thùng chứa" như trong [[Thư viện Tiêu bản Chuẩn} của [[C-Cộng-Cộng |C++]],. Nó cũng không bao gồm các bộ công cụ [[GUI]], các công cụ mạng, và những chức năng phong phú khác như [[Java]] đã cung cấp. Lợi thế chính của một thư viện chuẩn cở nhỏ là nó cung ứng một môi trường làm việc của ANSI C dểdễ dàng hơn so với các ngôn ngữ khác, và hậu quả là, việc xuất chưong trình C sang một nền tảng mới tương đối dểdễ dàng hơn.
 
Nhiều thư viẹn đã được phát triển để cung cấp chức năng tương đương với những thứ mà ngôn ngữ khác ó trong thư viện chuẩn. Thí dụ môi trường của đề án [[GNOME]] phát triển bộ công cụ đồ họa [[GTK]] và glib, một thư viện của thùng chứa các cấu trúc dữ liệu, và có rất nhiều thí dụ nổi tiếng khác. Nhiều thư viện có ý nghĩa với các bộ công cụ tuyệt vời đã tự chứng tỏ qua lịch sử. Một diểm đáng lưu tâm là các công cụ này thường không tương thích nhau, những người lập trình thường quen với sự khác nhau của các bộ thư viện này, và một bộ công cụ có thể khả dụng trong bất kì nền tảng nào.
 
== Các tập tin tiêu đề của chuẩn ANSI C ==
*''' <assert.h>''': Bao gồm [[macro]] [[assert]] dùng để hổ trợ trong việc phát hiện các lỗi lô-gíc và các kiểu lồi khác trong các phiên bản dùng để tìm lỗi của một chương trình.
 
*''' <complex.h>''': Một tập hợp các hàm dùng để điều chỉnh các [[số phức]] (mới có trong chuẩn '''C99''').
''' <assert.h>''': Bao gồm [[macro]] [[assert]] dùng để hổ trợ trong việc phát hiện các lỗi lô-gíc và các kiểu lồi khác trong các phiên bản dùng để tìm lỗi của một chương trình.
*''' <[[ctype.h]]>''': bao gồm các hàm dùng để phân lớp các kí tự bởi các kiểu hay dùng để chuyển đổi giữa chữ viết hoa và viết thường.
 
*'''<errno.h>''': Dùng để thử (hay hiển thị) các lỗi được báo cáo từ các hàm thư viện.
''' <complex.h>''': Một tập hợp các hàm dùng để điều chỉnh các [[số phức]] (mới có trong chuẩn '''C99''')
*''' <fenv.h>''': Dùng để kiểm soát môi trường [[chấm động]]. (mới có trong '''C99''').
 
*''' <float.h>''': Bao gồm định nghĩa các hằng mà nêu ra các đặc tính xây dựng của thư viện [[chấm động]], như là sự khác nhau nhỏ nhất của hai số chấm động (có thể có) qua _EPSILON, số lớn nhất của các chữ số của độ chính xác qua _DIG và khoảng cách của các số mà có thể biểu thị được qua _MIN và _MAX.
''' <[[ctype.h]]>''': bao gồm các hàm dùng để phân lớp các kí tự bởi các kiểu hay dùng để chuyển đổi giữa chữ viết hoa và viết thường.
*''' <inttypes.h>''': Dùng cho việc chuỷen đổi kiểu chính xác giữa các kiểu nguyên. (mới có trong '''C99''').
 
*''' <errnoiso646.h>''': DùngĐể đểlập thửtrình (haytrong hiển[[ISO thị)646]] cho cho các lỗibộ được báotự cáokhác từnhau các(mới hàm thưtrong viện'''[[#NA1|NA1]]''').
*''' <limits.h>''': Chứa định nghĩa các hằng có đặc tính đặc biệt của các kiểu nguyên, như là khoảng cách của các số mà có thể biểu thị quan _MIN, _MAX.
 
''' <fenv.h>''': Dùng để kiểm soát môi trường [[chấm động]]. (mới có trong '''C99''')
 
''' <float.h>''': Bao gồm định nghĩa các hằng mà nêu ra các đặc tính xây dựng của thư viện [[chấm động]], như là sự khác nhau nhỏ nhất của hai số chấm động (có thể có) qua _EPSILON, số lớn nhất của các chữ số của độ chính xác qua _DIG và khoảng cách của các số mà có thể biểu thị được qua _MIN và _MAX.
 
''' <inttypes.h>''': Dùng cho việc chuỷen đổi kiểu chính xác giữa các kiểu nguyên. (mới có trong '''C99''')
 
''' <iso646.h>''': Để lập trình trong [[ISO 646]] cho cho các bộ kí tự khác nhau . (mới có trong '''[[#NA1|NA1]]''')
 
''' <limits.h>''': Chứa định nghĩa các hằng có đặc tính đặc biệt của các kiểu nguyên, như là khoảng cách của các số mà có thể biểu thị quan _MIN, _MAX.
 
Contains defined constants specifying the implementation-specific properties of the integer types, such as the range of numbers which can be represented (_MIN, _MAX).
 
*''' <locale.h>''': Dùng cho <code>setlocale()</code> và các hằng có liên quan. Việc này đuợc dùng để lựa chọn [[địa phương]] cần thiết.
*''' <math.h>''': Cho việc tính các hàm số thông dụng.
 
*''' <setjmp.h>''': Khai báo [[setjump/longjump]] đưuợc dùng trong việc thoát ra của nơi không có tính địa phương.
''' <math.h>''': Cho việc tính các hàm số thông dụng.
*'''<signal.h>''': Để kiểm soát các điều kiện ngoại lệ.
 
*''' <stdarg.h>''': Để truy cập số lượng khác nhau của các đối số được chuyển vào hàm.
''' <setjmp.h>''': Khai báo [[setjump/longjump]] đưuợc dùng trong việc thoát ra của nơi không có tính địa phương.
*''' <stdbool.h>''': ĐùngDùng cho khiểu dữ liệu [[Bool]] (mới có trong '''C99''').
 
*''' <signalstdint.h> ''': ĐểDùng kiểmtrong soátviệc định nghĩa các điềukiểu kiênnguyên ngoạikhác lệnhau (mới có trong '''C99''').
*''' <stddef.h>''': Cung cấp nhiều kiểu và macro hữu dụng.
 
*''' <stdio.h>''': Cung cấp cốt lõi của những khả năng nhập trong C. tậpTập tin này bao gồm họ hàm <code>[[printf]]</code>.
''' <stdarg.h>''': Để truy cập số lượng khác nhau của các đối số được chuyển vào hàm.
*''' <stdlib.h>''': D`ungDùng để xúc tiến nhiều phép toán, bao gồm sự chuyển đổi, các số giả ngầu nhiên, cấp phát vùng nhớ, kiểm soát quá trình, môi trường, tín hiệu, tìm kiếm, và xếp thứ tự.
 
*''' <string.h>''': Để điều chỉnh nhiều loại dãy kí tự.
''' <stdbool.h>''': Đùng cho khiểu dữ liệu [[Bool]] (mới có trong '''C99''')
*''' <tgmath.h>''': Dùng cho các hàm toán kiểu thông dụng (mới có trong '''C99''').
 
*''' <stdinttime.h> ''': dùngĐể trongchuyển việcđổi định nghĩagiữa các kiểuđịnh nguyêndạng khác nhau về (mớithì giờ trong '''C99''')ngày tháng.
*''' <wchar.h>''': Để điều chỉnh độ rộng của các dòng (dữ liệu) và nhiều loại dãy kí tự sử dụng nhiều (loại) kí tự có độ lớn (Unicode chẳng hạn). -- Đây là chìa khóa để hổ trợ nhiều ngôn ngữ (mới có trong '''NA1''').
 
*''' <iso646wctype.h>''': Để lậpphân trình trong [[ISO 646]] cho cholớp các bộ kí tự khác nhauđộ .lớn (mới có trong '''[[#NA1|NA1]]''').
''' <stddef.h>''': Cung cấp nhiều kiểu và macro hữu dụng.
 
''' <stdio.h>''': Cung cấp cốt lõi của những khả năng nhập trong C. tập tin này bao gồm họ hàm <code>[[printf]]</code>.
 
''' <stdlib.h>''': D`ung để xúc tiến nhiều phép toán, bao gồm sự chuyển đổi, các số giả ngầu nhiên, cấp phát vùng nhớ, kiểm soát quá trình, môi trường, tín hiệu, tìm kiếm, và xếp thứ tự.
 
''' <string.h>''': Để điều chỉnh nhiều loại dãy kí tự.
 
''' <tgmath.h>''': Dùng cho các hàm toán kiểu thông dụng (mới có trong '''C99''')
 
''' <time.h>''': Để chuyển đổi giữ các định dạng khác nhau về thì giờ và ngày tháng.
 
''' <wchar.h>''': Để điều chỉnh độ rộng của các dòng (dữ liệu) và nhiều loại dãy kí tự sử dụng nhiều (loại) kí tự có độ lớn (Unicode chẳng hạn). -- Đây là chìa khóa để hổ trợ nhiều ngôn ngữ (mới có trong '''NA1''')
 
''' <wctype.h>''': Để phân lớp các kí tự có độ lớn (mới có trong '''NA1''')
 
== Thư Việnviện chuẩn C trong C++ ==
:''Xem thêm [[Thư viện chuẩn C-cộng-cộng|Thư viện chuẩn C++]]
ngônNgôn ngữ [[C-cộng-cộng|C++]] bao gồm chức năng của thư viện chuẩn ANSI C nhưng được làm thêm nhiều thay đổi như là đổi tên của các tập tin tiêu đề từ <tt><xxx.h></tt> sang <tt><cxxx></tt> (mặc dù đã dược lưu ý cho sự thay đổi, các tên kiểu-C thì vẩn sử dụng được), và C++ xếp tất cả các [[định danh]] (''identifier'') vào trong vào trong [[không gian tên]] <code>std</code>.
 
== Liên kết ngoài ==
*[http://www.infosys.utas.edu.au/info/documentation/C/CStdLib.html The C Standard Library]: A detailed description of the header files
*[http://www.acm.uiuc.edu/webmonkeys/book/c_guide/index.html The C Library Reference Guide]