Sự khác biệt giữa C, C99, ANSI C và GNU C là gì?


122

Tôi đã bắt đầu thực hành lập trình trên codechef và đã bối rối bởi sự khác biệt giữa C và C99. C ở đây có nghĩa là gì? Có phải là C89 không? Kiểm tra các ngôn ngữ ở cuối bài nộp này . Nó chứa cả C và C99.

Tôi tìm thấy trên internet một cái gì đó có tên là GNU C. Có một C khác cho hệ thống linux / unix không? Những thứ này có tuân thủ các tiêu chuẩn C của ANSI không? Tôi cũng đã đọc ở một số nơi "C99 nghiêm ngặt". Cái này là cái gì?

Có bất kỳ tiêu chuẩn khác nhau nào khác của C đang được sử dụng không? Có cái gì đó được gọi là C 4.3.2 hay nó là phiên bản gcc đang được sử dụng?

BIÊN TẬP:

Điều này , Điều này , Điều này đã giúp. Tôi sẽ tìm kiếm thêm và chỉnh sửa những thứ chưa được trả lời.

Tôi không phải là một người mới lập trình. Tôi biết ngôn ngữ C là gì. Tôi biết rằng có các tiêu chuẩn C khác nhau của ANSI như C89, C99 và C11.


@Sẽ tôi đã không tìm kiếm nhiều. Tôi đã làm ngay bây giờ. Tôi sẽ làm nhiều hơn nữa. và chỉnh sửa câu hỏi nhiều hơn.
Aseem Bansal

@ Will tôi đã không thể tìm về C99 nghiêm ngặt và liệu C trong codechef là C89 hoặc không được chuẩn hóa trước đó C. gốc
Aseem Bansal

1
Đừng quên về POSIX C :-)
pmg

Câu trả lời:


216
  • Mọi thứ trước khi chuẩn hóa thường được gọi là "K&R C", theo tên cuốn sách nổi tiếng , với Dennis Ritchie, người phát minh ra ngôn ngữ C, là một trong những tác giả. Đây là "ngôn ngữ C" từ năm 1972-1989.

  • Tiêu chuẩn C đầu tiên được phát hành trên toàn quốc năm 1989 tại Hoa Kỳ, bởi viện tiêu chuẩn quốc gia ANSI. Bản phát hành này được gọi là C89 hoặc ANSI-C. Từ năm 1989-1990 đây là "ngôn ngữ C".

  • Năm sau, tiêu chuẩn Mỹ đã được quốc tế chấp nhận và được công bố bởi ISO (ISO 9899: 1990). Bản phát hành này được gọi là C90. Về mặt kỹ thuật, nó là tiêu chuẩn tương tự như C89 / ANSI-C. Về mặt hình thức, nó thay thế C89 / ANSI-C, khiến chúng trở nên lỗi thời. Từ 1990-1999, C90 là "ngôn ngữ C".

    Xin lưu ý rằng kể từ năm 1989, ANSI không liên quan gì đến ngôn ngữ C. Các lập trình viên vẫn nói về "ANSI C" thường không có manh mối về ý nghĩa của nó. ISO "sở hữu" ngôn ngữ C, thông qua tiêu chuẩn ISO 9899.

  • Một bản cập nhật nhỏ đã được phát hành vào năm 1995, đôi khi được gọi là "C95". Đây không phải là một sửa đổi lớn, mà là một sửa đổi kỹ thuật có tên chính thức là ISO / IEC 9899: 1990 / Amd.1: 1995. Thay đổi chính là giới thiệu hỗ trợ nhân vật rộng rãi.

  • Năm 1999, tiêu chuẩn C đã trải qua một lần sửa đổi lớn (ISO 9899: 1999). Phiên bản tiêu chuẩn này được gọi là C99. Từ năm 1999-2011, đây là "ngôn ngữ C".

  • Năm 2011, tiêu chuẩn C lại được thay đổi (ISO 9899: 2011). Phiên bản này được gọi là C11. Tính năng mới khác nhau như _Generic, _Static_assertvà hỗ trợ chủ đề đã được thêm vào ngôn ngữ. Bản cập nhật tập trung nhiều vào đa lõi, đa xử lý và giải trình tự biểu thức. Từ năm 2011-2017, đây là "ngôn ngữ C".

  • Năm 2017, C11 đã được sửa đổi và các báo cáo sai sót khác nhau đã được giải quyết. Tiêu chuẩn này được gọi không chính thức là C17 và được phát hành dưới tên ISO 9899: 2018. Nó không có tính năng mới, chỉ là những sửa chữa. Đây là phiên bản hiện tại của ngôn ngữ C.


"C99 nghiêm ngặt" có thể đề cập đến cài đặt trình biên dịch buộc trình biên dịch phải tuân theo tiêu chuẩn bằng chữ cái. Có một điều khoản thực hiện phù hợp trong tiêu chuẩn C. Về cơ bản nó có nghĩa là: "trình biên dịch này thực sự triển khai ngôn ngữ C một cách chính xác". Các chương trình triển khai ngôn ngữ C một cách chính xác được chính thức gọi là các chương trình tuân thủ nghiêm ngặt .

"GNU C" có thể có nghĩa là hai điều. Bản thân trình biên dịch C là một phần của Bộ sưu tập trình biên dịch GNU (GCC). Hoặc nó có thể có nghĩa là thiết lập mặc định không chuẩn mà trình biên dịch GCC C sử dụng. Nếu bạn biên dịch với gcc program.cthì bạn không biên dịch theo tiêu chuẩn C, mà là thiết lập GNU không theo tiêu chuẩn, có thể được gọi là "GNU C". Ví dụ, toàn bộ nhân Linux được tạo bằng GNU C không chuẩn và không phải trong C chuẩn.

Nếu bạn muốn biên dịch các chương trình của mình theo tiêu chuẩn C, bạn nên nhập gcc -std=c99 -pedantic-errors. Thay thế c99 bằng c11 nếu phiên bản GCC của bạn hỗ trợ nó.


8
Cài đặt trình biên dịch nghiêm ngặt có thể có nghĩa là “Tắt tiện ích mở rộng; chỉ sử dụng ngôn ngữ C được xác định bởi tiêu chuẩn "cũng như" biên dịch chính xác ". Việc chấp nhận các phần mở rộng cho ngôn ngữ là hoàn toàn chính xác; tiêu chuẩn đã được xác định để cho phép điều đó.
Eric Postpischil

5
Ngoài ra còn có Bản sửa đổi 1 C94 / C95 bổ sung hỗ trợ nhiều nhân vật hơn, chủ yếu. Xem thêm Danh sách Tệp Tiêu đề Chuẩn trong C và C ++ .
Jonathan Leffler

2
Bạn viết rằng rất nhiều thứ đã thay đổi từ C90 sang C99. Bạn có thể vui lòng kể tên một vài?
Martin Thoma

3
@Lundin bạn đã liên kết nhầm sách cho K&R; đây là phiên bản thứ hai mô tả tiêu chuẩn C89.
Antti Haapala

5
Vâng, nhưng vấn đề là đó không phải là phiên bản định nghĩa ngôn ngữ lập trình C cho đến thời điểm này; không phải là nó sẽ được bán ở bất cứ đâu.
Antti Haapala

7

TÔI PHẢI trả lời liên quan đến ANSI C. Mặc dù ANSI chưa làm gì với nó, nhưng các trình biên dịch vẫn được xây dựng cho nó. Trình biên dịch PIC XC16 ví dụ: "Trình biên dịch là trình biên dịch đã được xác thực đầy đủ phù hợp với tiêu chuẩn ANSI C như được định nghĩa bởi đặc tả ANSI (ANSI x3.159-1989) và được mô tả trong Ngôn ngữ lập trình C của Kernighan và Ritchie (ấn bản thứ hai). ... "Không phải tất cả các lập trình đều dành cho máy tính" lớn "như PC. Viết một trình biên dịch cho chi phí thiết bị của bạn và việc xác thực tốn thời gian & $. ANSI C vẫn tồn tại và khỏe mạnh trong các thiết bị được nhúng / thời gian thực của bạn.


4
  • ANSI C: Ngôn ngữ C đầu tiên được tiêu chuẩn hóa bởi tổ chức có tên ANSI vào năm 1989, đó là lý do tại sao nó được gọi là c89.

  • C99:
    với nhu cầu từ các yêu cầu của nhà phát triển, trong năm 1999-2000, các từ khóa và tính năng bổ sung hoặc bổ sung đã được đưa vào C99 (ví dụ: inline, boolean .. Đã thêm các hàm thư viện arthematic dấu chấm động)

  • GNU C: GNU là một hệ điều hành giống unix (www.gnu.org) và ở đâu đó dự án của GNU cần ngôn ngữ lập trình C dựa trên tiêu chuẩn ANSI C. GNU sử dụng trình biên dịch GCC (GNU Compiler Collection) để biên dịch mã. Nó có chức năng thư viện C xác định các lệnh gọi hệ thống như malloc, calloc, exit ... vv

ANSI C là một tiêu chuẩn đang được sử dụng bởi các tiêu chuẩn khác.


Bất cứ điều gì về C99 nghiêm ngặt và liệu C trong codechef là C89 hoặc bản gốc C không được chuẩn hóa trước đó
Aseem Bansal

Đính chính: ANSI C là một tiêu chuẩn lỗi thời, chỉ được đề cập đến bởi các tài liệu lỗi thời. Ngôn ngữ C được gọi là ISO C, hoặc nếu bạn sẽ là ISO / IEC 9899: 2011.
Lundin

1

Ngoài câu trả lời của Lundin

Đây là những gì Dennis Richie phải nói khi được hỏi

"Tại sao K&R không đợi tiêu chuẩn ANSI cuối cùng, đã được phê duyệt trước khi viết K&R phiên bản thứ 2?"

Tại sao K&R không đợi tiêu chuẩn ANSI cuối cùng đã được phê duyệt trước khi viết K&R phiên bản thứ 2? Có vẻ như cuốn sách này sẽ chỉ là tiêu chuẩn chính xác trong vài tháng trước khi nó bị kiện bởi tiêu chuẩn ANSI cuối cùng. Tôi biết rằng có thể sẽ có một vài thay đổi lớn ở giai đoạn cuối này, nhưng tại sao không đợi một vài tháng và đảm bảo rằng bạn làm đúng 100%, thay vì gần như ngay lập tức viết một ấn bản thứ 3 hoặc đã lỗi thời?

Chúng tôi nghĩ sẽ rất vui khi đánh dấu kỷ niệm 10 năm xuất bản lần đầu tiên. Nghiêm trọng hơn, chúng tôi đã bắt đầu làm việc vào mùa hè năm ngoái vì chúng tôi đã có thời gian và xu hướng khi đó, và có vẻ như X3J11 sắp kết thúc. Vào tháng 12 và tháng 1, khi chúng tôi đang hoàn tất, chúng tôi đã xem xét liệu khả năng có những thay đổi quan trọng có đảm bảo việc giao hàng không và (sau khi thảo luận vấn đề với nhà xuất bản) quyết định rằng điều đó không đáng phải chờ đợi. PH muốn nó, và cả Brian và tôi đều muốn nó nằm ngoài kế hoạch của chúng tôi.

Ngay cả khi có những thay đổi trong tiêu chuẩn, thật khó để tưởng tượng rằng chúng sẽ đủ rộng rãi để đảm bảo một phiên bản mới. (Chúng tôi thậm chí đã chuẩn bị để đối phó bằng cách nào đó với noalias, nếu nó kéo dài.) Chúng tôi đã sẵn sàng thực hiện những thay đổi cần thiết trong lần in trong tương lai, nhưng có lý do để hy vọng rằng chúng chỉ nên nhỏ. Các thành viên của X3J11 cũng rất lo lắng để hoàn thành mà không làm mọi người ngạc nhiên; nhiều người trong số họ làm việc cho các công ty đang chuẩn bị trình biên dịch ANSI.

Dennis Ritchie


1
Quá xấu Dennis Ritchie đã không nhận ra như thế nào aliasing quy tắc sẽ được sử dụng để ngụ ý rằng trình biên dịch không nên thực hiện bất kỳ nỗ lực để nhận ra hình thức hữu ích của răng cưa, nhưng thay vì cho rằng các lập trình viên mà đang bị phá vỡ bởi các trình biên dịch tù nên "cảm ơn" các trình biên dịch cho hiển thị cho họ mã của họ là "bị lỗi" - nếu không, anh ta có thể nói với những người thúc đẩy các quy tắc như vậy để làm rõ rằng việc từ chối hỗ trợ bí danh vượt quá yêu cầu tối thiểu của Tiêu chuẩn sẽ khiến trình biên dịch không phù hợp cho một số mục đích và nhu cầu về bí danh của mã cấp thấp là không phải là một khiếm khuyết.
supercat

@supercat Tôi thực sự không hiểu quy tắc răng cưa nghĩa là gì, bạn có thể giúp tôi không?
Suraj Jain

1
Khái niệm ban đầu là mã đã cho giống như int i; int test(double *p) { i=1; *p=2.0; return i; }một trình biên dịch không cần thiết phải tải lại isau khi ghi *pvào nếu pcó thể có địa chỉ của i. Hoàn toàn hợp lý. Vấn đề là các trình biên dịch hiện đại sử dụng cùng một quy tắc để biện minh cho các giả định ghi vào a long*sẽ không ảnh hưởng đến a long long, ngay cả khi cả hai loại có cùng kích thước và cách biểu diễn , và ngay cả khi hai cấu trúc chia sẻ Trình tự ban đầu chung, thì mã sẽ không bao giờ sử dụng một con trỏ của một kiểu để đọc một thành viên CIS được viết qua kiểu kia.
supercat

-2

Câu hỏi này đã không được tìm kiếm kỹ lưỡng trên mạng để tìm câu trả lời, dù sao bạn có thể xem phần này:

  1. C là một ngôn ngữ lập trình đa năng được Dennis Ritchie phát triển ban đầu từ năm 1969 đến năm 1973 tại AT&T Bell Labs.
  2. C99 là một tiêu chuẩn của ngôn ngữ C được ISO xuất bản và ANSI thông qua vào khoảng năm 1999.
  3. GNU C chỉ là một phần mở rộng của c89, trong khi một số tính năng của c99 cũng được thêm vào, nhưng về tổng thể nó khác với tiêu chuẩn c99 nên khi biên dịch bằng gcc chúng ta phải nhập -std=c99cái đã được đề cập trong các câu trả lời khác.
  4. ANSI C là một loạt các tiêu chuẩn liên tiếp được ANSI phát hành.

Tôi đã tìm kiếm trên mạng ngay bây giờ. Tôi đã chỉnh sửa câu hỏi. Tôi đã biết về tiêu chuẩn C và ANSI trước khi đăng câu hỏi. Tôi đang có sự nhầm lẫn về những thứ cụ thể. Tôi sẽ cố gắng nói chính xác hơn.
Aseem Bansal

Bất cứ điều gì về C99 nghiêm ngặt và liệu C trong codechef là C89 hoặc bản gốc C không được chuẩn hóa trước đó
Aseem Bansal

4
Câu trả lời này có nhiều sai sót. C99 là một tiêu chuẩn được ISO xác định vào khoảng năm 1999. Ngôn ngữ C đã được tiêu chuẩn hóa quốc tế trong 23 năm. Vì vậy, ANSI không có gì để làm với nó, họ đã không đạt được tiêu chuẩn C trong 24 năm. Ngày nay, họ chỉ in và phân phối tiêu chuẩn ISO cho thị trường Mỹ.
Lundin

@Lundin Ôi !! vâng, thực ra tôi đã viết "được định nghĩa" không đúng như vậy, nó phải được "thông qua" ở đó. Tôi đã chỉnh sửa, ANSI đã phát hành tiêu chuẩn đầu tiên cho cách C vào năm 1989, được ISO thông qua. sau đó hầu hết tất cả các tiêu chuẩn đã được phát hành bởi ISO và được ANSI thông qua, và câu trả lời ngắn gọn như được hỏi, vì vậy tôi chỉ đề cập một số điều để giữ câu trả lời ngắn gọn.
0decimal0

1
Lưu ý rằng gcchỗ trợ -std=c89-std=gnu89-std=c99-std=gnu99(và các phiên bản đủ hiện đại hỗ trợ -std=c11-std=gnu11). Sự khác biệt là liên quan đến các phần mở rộng trên Tiêu chuẩn C được cung cấp tự động hoặc chỉ khi nguồn thúc đẩy trình biên dịch cung cấp cho chúng các macro thích hợp (chẳng hạn như -D_XOPEN_SOURCE=700).
Jonathan Leffler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.