2011-12-09 36 views
6

câu hỏi nhanh:Enumeration Phạm vi

Nếu tôi có enums như:

enum EnumA 
{ 
    stuffA = 0 
}; 
enum enumAA 
{ 
    stuffA = 1 
}; 

gì xảy ra ở đây khi bạn tham khảo stuffA? Tôi nghĩ rằng bạn sẽ đề cập đến chúng như EnumA.stuffAEnumB.stuffA như trong java, nhưng điều đó dường như không đúng.

Cảm ơn mọi thông tin chi tiết

Chỉnh sửa-Cảm ​​ơn bạn đã trả lời nhanh!

Trả lời

7

enums không giới thiệu phạm vi mới.

Trong ví dụ của bạn, enum thứ hai sẽ không biên dịch do xung đột tên stuffA.

Để tránh xung đột tên, thực tiễn phổ biến là cung cấp cho các thành phần của tiền tố chung là enum. tiền tố khác nhau sẽ được sử dụng cho sự đếm khác nhau:

enum EnumA 
{ 
    EA_stuffA = 0 
}; 
enum EnumAA 
{ 
    EAA_stuffA = 1 
}; 
+0

Vì vậy, nếu tôi muốn thực hiện điều gì đó như trên (phạm vi hẹp), cấu trúc sẽ là cược duy nhất/tốt nhất của tôi? – prelic

+0

Bạn sẽ phải sử dụng một cái gì đó: 'enum enumA {enumA_stuffA = 0}; enum enumAA {enumAA_stuffA = 1}; ' –

5

Các hằng liệt kê được trong không gian tên toàn cầu (chính xác hơn, các định danh thông thường không gian tên, tương phản với các nhãn, không gian tên thẻ, và cấu trúc/thành viên công đoàn), vì vậy bạn gặp lỗi biên dịch vào ngày stuffA thứ hai.

Bạn không thể sử dụng hai giá trị khác nhau cho cùng một tên điều tra (cũng không phải giá trị giống nhau được chỉ định hai lần) trong một đơn vị dịch.

1

Như đã đề cập, thao tác này sẽ không biên dịch vì nội dungA được xác định hai lần. Các giá trị enum chỉ đơn giản được gọi bằng cách liệt kê (đó là "stuffA" chứ không phải là EnumA.stuffA). Bạn thậm chí có thể sử dụng chúng trên các loại không phải là enums (chẳng hạn như số nguyên). Enums đôi khi được sử dụng theo cách này với ints, tương tự như cách một # define xác định.

+2

Trong C,' enum' hằng số * là * 'int' theo định nghĩa của tiêu chuẩn. –

3

Như những người khác đã cho biết hằng số liệt kê phải là duy nhất trong phạm vi thực tế nơi chúng được xác định. Nhưng với chúng như với các định danh khác, nó được phép xác định lại chúng trong phạm vi khác. Ví dụ.

enum EnumA 
{ 
    stuffA = 0 
}; 

void func(void) { 
    enum enumAA 
    { 
    stuffA = 1 
    }; 
    // do something 
} 

sẽ ổn. Nhưng các định nghĩa lại như vậy trong các phạm vi khác nhau thường bị cau mày và phải được ghi chép đầy đủ, nếu không bạn sẽ nhanh chóng mất đi bản thân và những người khác.

+3

+1 Và may mắn là gcc với '-Wshadow' cho' cảnh báo: tuyên bố 'stuffA' đổ bóng một tuyên bố toàn cầu'. –