2010-06-25 30 views
8

enum và #define xuất hiện để có thể làm điều tương tự, ví dụ dưới đây xác định kiểu. Hiểu rằng #define là thay thế macro cho trình tiền xử lý biên dịch. Có trường hợp nào được ưu tiên hơn trường hợp khác không?enum hoặc xác định, cái nào tôi nên sử dụng?

typedef enum { 
    SelectionStyleNone, 
    SelectionStyleBlue, 
    SelectionStyleRed 
} SelectionStyle; 

vs

#define SELECTION_STYLE_NONE 0 
#define SELECTION_STYLE_BLUE 1 
#define SELECTION_STYLE_RED 2 
+0

Xem thêm: [Tôi có nên sử dụng #define, enum hoặc const?] (Http://stackoverflow.com/questions/112433/should-i-use-define-enum-or-const) – Shog9

Trả lời

3

Một enum là tốt nhất nếu bạn muốn loại an toàn. Chúng cũng được xuất dưới dạng ký hiệu, vì vậy một số trình gỡ rối có thể hiển thị chúng trực tuyến trong khi chúng không thể xác định.

Vấn đề chính với enums tất nhiên là chúng chỉ có thể chứa số nguyên. Đối với các chuỗi, phao vv ... bạn có thể tốt hơn với một const hoặc một định nghĩa.

+0

ý của bạn là gì về loại an toàn? mã này là hợp pháp: enum E {A = 1}; E t = E (2); và kết quả là không xác định. Vì vậy, enums là TYPE an toàn, nhưng không phải là VALUE an toàn, do đó, chúng gần như xấu như định nghĩa/ – f0b0s

+0

Với phôi bạn có thể làm mọi thứ, điều đó không chứng minh được điều gì. – kmm

11

Đừng bao giờ sử dụng định nghĩa trừ khi bạn PHẢI có chức năng của tiền xử lý. Đối với một cái gì đó đơn giản như một điều tra tích phân, sử dụng một enum.

1

Xác định có thể nhanh hơn một chút (thời gian chạy) so với enums, nhưng lợi ích có lẽ chỉ là một số ít chu kỳ, do đó, nó không đáng kể trừ khi bạn đang làm một cái gì đó thực sự đòi hỏi điều đó. Tôi muốn đi với enum, kể từ khi sử dụng bộ tiền xử lý là khó khăn hơn để gỡ lỗi.

+1

Tôi nghĩ bạn có nghĩa là "đi với enum"? – nall

1

Khi có tính năng ngôn ngữ tích hợp hỗ trợ những gì bạn muốn làm (trong trường hợp này, liệt kê các mục), bạn có thể nên sử dụng tính năng đó.

0
#define DEFINED_VALUE 1 
#define DEFINED_VALUE 2 // Warning 
enum { ENUM_VALUE = 1 }; 
enum { ENUM_VALUE = 2 }; // Error 

Với #define, có khả năng cao hơn là giới thiệu các lỗi tinh tế.

Các vấn đề liên quan