Dấu phẩy cuối cùng được yêu cầu trong khai báo enum C?Dấu phẩy cuối cùng trong C enum có bắt buộc phải không?
tức là dấu phẩy sau VAL3 được yêu cầu?
enum{Val1, Val2, Val3,} someEnum;
Có bất kỳ tác dụng phụ của nó để lại in/out
Cảm ơn
Dấu phẩy cuối cùng được yêu cầu trong khai báo enum C?Dấu phẩy cuối cùng trong C enum có bắt buộc phải không?
tức là dấu phẩy sau VAL3 được yêu cầu?
enum{Val1, Val2, Val3,} someEnum;
Có bất kỳ tác dụng phụ của nó để lại in/out
Cảm ơn
Không bắt buộc. Mục 6.7.2.2
của C99 liệt kê các cú pháp như sau:
enum-specifier:
enum identifieropt { enumerator-list }
enum identifieropt { enumerator-list , }
enum identifier
enumerator-list:
enumerator
enumerator-list , enumerator
enumerator:
enumeration-constant
enumeration-constant = constant-expression
Chú ý hai hình thức đầu tiên của enum-specifier
, một với các dấu phẩy đuôi và một không có.
Một lợi thế tôi đã nhìn thấy việc sử dụng nó là trong những thứ như:
enum {
Val1,
Val2,
Val3,
} someEnum;
ở đâu, nếu bạn muốn thêm vào (ví dụ) Val4
và Val5
, bạn chỉ cần sao chép và dán dòng Val3
không phải lo lắng về việc điều chỉnh dấu phẩy.
Và, như được chỉ ra trong nhận xét, cũng có thể đơn giản hóa các trình tạo mã tự động để chúng không phải xử lý đặc biệt cho giá trị cuối cùng. Họ chỉ có thể xuất mỗi giá trị theo sau dấu phẩy.
Điều này có thể được so sánh với SQL oft-thấy:
select fld1, fld2 from tbl where 1=1 and fld1 > 8
Trong trường hợp đó, where 1=1
là có chỉ để bạn không cần phải đặt một where
trước khi khoản đầu tiên của bạn và một and
trước mỗi cái tiếp theo. Bạn chỉ có thể dựa vào thực tế là where
đã có và chỉ sử dụng and
cho tất cả những cái bạn thêm.
Một số người có thể nghĩ rằng đây sặc mùi lười biếng và họ nói đúng, nhưng đó là không nhất thiết phải là một điều xấu :-)
Bất kỳ phong nha DBMS truy vấn optimizer sẽ có thể loại bỏ điều khoản liên tục như vậy trước khi đi các bảng cơ sở dữ liệu.
Một lý do khác tôi đã nghe cho nó là cho mã máy được tạo ra - một trường hợp góc ít hơn cần thiết trong bộ tạo mã. –
Không, nó không cần thiết và cần được bỏ qua cho mã rõ ràng. Sự hiện diện/vắng mặt của nó không có hiệu lực.
Sẽ chính xác hơn khi nói rằng dấu phẩy sau không có giá trị ngữ nghĩa. Sự vắng mặt của nó có thể làm cho việc bảo trì mã ít thuận tiện hơn. Theo cách nào thì sự vắng mặt của dấu phẩy làm cho mã rõ ràng hơn? –
Khi phần tử cuối cùng của enum được theo sau bởi một cú đúp ngay lập tức nó trông rõ ràng hơn với tôi. Đó là chủ quan tôi cho là. – sharptooth
Không cần thiết - trong thực tế, tôi sẽ nói rằng nó có kiểu xấu.
Không cần thiết. Lý do là, nó làm cho nó dễ dàng hơn cho các mục đích cắt và dán mã, nếu bạn không cần phải lo lắng về việc liệu dấu phẩy có nghĩa là có hay không.
Như đã nêu, nó không bắt buộc. Lý do mà dấu phẩy được hỗ trợ là nó (giả sử các mục được xếp thành một dòng) cho phép bạn sắp xếp lại thứ tự các mục trong một liệt kê một cách thuận tiện bằng cách cắt/dán hoặc kéo/thả và nó cũng cho phép bạn để bình luận ra mục cuối cùng mà không tạo ra lỗi cú pháp. Bỏ qua dấu phẩy là hợp pháp nhưng mất những lợi thế bảo trì mã.
Tôi đã quên nhưng Nick khá đúng. Tôi cũng đã khai thác dấu phẩy sau bằng các chỉ thị của trình biên dịch. Không có nó, mã điều kiện sẽ có nhiều thứ lộn xộn và khó đọc hơn.
Tùy chọn và hữu ích, nếu bạn sử dụng macro, ví dụ:
#ifdef _FLAG
#define OPTS opt_four, opt_five,
#else
#define OPTS // none
#endif
enum {
opt_one,
opt_two,
opt_three,
OPTS
};
Không bắt buộc, giải thích một số trình biên dịch khiếu nại nếu bạn thêm. ví dụ Visual Studio 6.
Một sử dụng cho dấu phẩy là để tạo enums bằng cách sử dụng macro c.
#define ELEMENT(x) x,
enum MyElements {
ELEMENT(a)
ELEMENT(b)
ELEMENT(c)
};
Mẫu này hữu ích nếu bạn có vài việc bạn cần làm với các yếu tố và chỉ muốn xác định chúng một lần. Để có một ví dụ hoàn chỉnh hơn về điều này, bạn có thể xem mã số của libiconv và tiện ích iconv.
Điều này thật tệ. Tại sao không sử dụng: "#define ELEMENT (x) x" và sau đó thêm dấu phẩy trong enum? – nilton
Ý tưởng là nội dung của enum chính là một macro khác: '#define ALL_ELEMENTS (ELEMENT) ELEMENT (a) ELEMENT (b) ELEMENT (c)'. Sau đó, bạn '#define ELEMENT' vào bất kỳ thứ gì bạn cần vào bất kỳ thời điểm cụ thể nào và sau đó gọi macro' ALL_ELEMENTS'. –
Giống như mọi người khác nói, dấu phẩy là không bắt buộc. Nhưng nó mới trong C99 (không được phép trong C89) và sẽ được cho phép trong phiên bản tiếp theo của C++.
Một lý do khác là để tạo sự khác biệt giữa một "chiều dài" Enumerator và một điều tra viên bình thường:
enum Items {
A,
B,
C,
LENGTH
};
Bây giờ, bạn có thể đưa vào hướng dẫn mã hóa của bạn mà mục cuối cùng trong liệt kê của bạn nên có một dấu phẩy được áp dụng, nhưng không phải nếu đó là mục "Độ dài" - chỉ cho biết có bao nhiêu mục.
Nó cũng giúp tự động tạo các mục (sử dụng macro/tiền xử lý) như các câu trả lời khác giải thích.
Đó là một sự xấu hổ rằng thành ngữ LENGTH phá vỡ tự động kiểm tra cho sự hoàn chỉnh của switch (enum). –
Trong tiêu chuẩn C89, dấu phẩy cuối cùng không được phép. Ngừng hẳn.
Đó là phần mở rộng phổ biến để cho phép; đặc biệt, nó được GCC hỗ trợ, nhưng tiêu chuẩn rõ ràng không cho phép nó.
Trong chuẩn C99, dấu phẩy cuối cùng được cho phép, đối xứng với bộ khởi tạo mảng và cấu trúc, luôn cho phép dấu phẩy ở cuối mục.
6.7.2.2 Enumeration specifiers
Cú pháp
enum-specifier: enum identifieropt { enumerator-list } enum identifieropt { enumerator-list , } enum identifier
Ưu điểm chính của việc cho phép dấu phẩy trailing là nó cho phép hệ máy dễ dàng hơn (nguồn C) mã - bạn không có để viết mã trường hợp đặc biệt cho mục cuối cùng (hoặc, có thể, thứ nhất) trong danh sách các trình khởi tạo. Do đó, các chương trình như Yacc và Lex, để đặt tên nhưng hai, có thể đơn giản hơn một chút.
Câu trả lời khác đề cập đến nhưng tôi chỉ muốn làm nổi bật dấu phẩy không được phép trong tiêu chuẩn tuân thủ C89 và C++, làm cho nó trở thành vấn đề về tính di động với trình biên dịch cũ hoặc không phổ biến. Đây là một liên kết hữu ích giải thích vấn đề này và nhiều vấn đề C/C++ khác: http://david.tribble.com/text/cdiffs.htm#C99-enum-decl
Dấu phẩy cuối cùng là không bắt buộc.
Tôi thích dấu phẩy trailing vì hai lý do:
dd
).
Trong tiêu chuẩn C89, dấu phẩy cuối cùng đã bị cấm rõ ràng. Trong C99, họ cho phép nó. Tác dụng phụ của việc rời khỏi nó là nó không thể được biên dịch bởi các trình biên dịch C89 nghiêm ngặt. –