C11 và C99 có những khác biệt như thế nào và dùng cái nào thì tốt hơn?

Em vừa đọc trong một quyển sách nói là chuẩn C11 và C99 có một số khác biệt nhỏ, nhưng khi em tìm trên mạng thì không thấy tài liệu nào nói về điều này cả, không biết C11 và C99 có những khác biệt như thế nào và dùng cái nào thì tốt hơn ạ ???

Ý bạn là C++ 11 và C++ 99 phải không nhỉ?

C++ 11 là C++ phiên bản năm 2011, C++ 99 là C++ phiên bản năm 1999. Về khác biệt thì bạn có thể xem ở đây nè, ví dụ với List: http://www.cplusplus.com/reference/list/list/

Phiên bản hiện tại là C++ 17 thì phải, Về cơ bản thì phiên bản mới hơn thường chỉ bổ sung tính năng, hàm, tối ưu xử lý v…v… chứ đa số code viết theo chuẩn C++ 99 đều tương thích với các chuẩn mới hơn. Bạn cứ lấy phiên bản mới nhất mà học.

Ý của em là C11 và C99 trong lập trình C cơ, không biết anh có tài liệu nào về hai cái này không ạ ?

Vậy mình nhầm :sweat_smile:. Bên C thì mình không có.

TL;DR: C11 có những thay đổi cơ bản:

  • Việc hỗ trợ các khai báo kiểu T a[n]; (variable-length array) là “tùy hỉ” (optional)
  • Hỗ trợ cross-platform multithreading <thread.h> (lưu ý vẫn bị leak abstraction)
  • Trích xuất một số thông tin về cách biểu diễn số chấm động
  • Chính thức hỗ trợ Unicode <uchar.h>
  • Hỗ trợ khóa file cross-platform (‘x’ option)
  • Cấu trúc không tên (anonymous)
  • Hỗ trợ tùy biến biểu thức theo kiểu với từ khóa Generic
  • Chính thức hỗ trợ alignment <stdalign.h> (tức là canh kích cỡ 1 struct cho chẵn byte)

với lại thêm hàm nhập xuất có đuôi _s.

4 Likes

Tiện thể cho em hỏi luôn là làm sao để xác định chuẩn C đang dùng ạ ?

hình như C11 thì cho phép for(int i = 0; i < n, i++) còn C99 phải

int i;
for(i = 0; i < n; i++)
1 Like

Hình như kể từ C99 thì đã cho phép for(int i = 0; i<n; i++) rồi thì phải`

Em nhớ C99 đã cho phép for (int i = 0; i < n; ++i) rồi mà anh nhỉ :thinking:

2 Likes

Tùy trình biên dịch bạn dùng. gcc thì có hai cách xác định, còn VS không phải là C :slight_smile:

2 Likes

Em dùng gcc vậy xác định bằng cách nào ạ ?

1 Like

tại cũng không nhớ lắm, nhiều lần code nó bảo phải thêm option vào cho compiler mới được.

Em không làm được, mà hình như bài đó là cho Linux mà :frowning:

Tức là: (TL;dr)

  • Nếu bạn code cho vài chuẩn thì dùng macro rồi #if... #else... #endif
  • Còn nếu bạn chỉ code 1 chuẩn thì dùng option -std={c89/c99/c11/c14/c1x} khi gọi lên :smiley:
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?