2009-04-13 60 views
23

Nếu tôi có một cái gì đó như sau trong một tập tin tiêu đề, làm thế nào để tôi tuyên bố một hàm trả về một enum loại Foo?Trả về một enum từ một hàm trong C?

enum Foo 
{ 
    BAR, 
    BAZ 
}; 

Tôi có thể làm điều gì đó như sau không?

Foo testFunc() 
{ 
    return Foo.BAR; 
} 

Hoặc tôi có cần sử dụng typedef hoặc con trỏ hay gì đó không?

Trả lời

38

Trong C++, bạn chỉ có thể sử dụng Foo.

Trong C, bạn phải sử dụng enum Foo cho đến khi bạn cung cấp typedef cho nó.

Và sau đó, khi bạn tham khảo BAR, bạn không sử dụng Foo.BAR nhưng chỉ BAR. Tất cả các hằng số liệt kê chia sẻ cùng một không gian tên.

Do đó (ví C):

enum Foo { BAR, BAZ }; 

enum Foo testFunc(void) 
{ 
    return BAR; 
} 

Hoặc, với một typedef:

typedef enum Foo { BAR, BAZ } Foo; 

Foo testFunc(void) 
{ 
    return BAR; 
} 
4

Tôi tin rằng các giá trị cá nhân trong enum là những định danh theo đúng nghĩa của họ, chỉ cần sử dụng:

enum Foo testFunc(){ 
    return BAR; 
} 
+0

Trong C, nó cần enum Foo; trong C++, chỉ Foo là OK. –

+0

Cảm ơn. Hoặc loại def mà Kenny gợi ý, tôi cho là vậy. – dmckee

+0

Có - hoặc typedef sẽ hoạt động, nhưng trong C++ là 'tự động' nhưng trong C nó phải được tạo thủ công. –

2

Tôi nghĩ rằng một số các trình biên dịch có thể yêu cầu

typedef enum tagFoo 
{ 
    BAR, 
    BAZ, 
} Foo; 
+0

Trình biên dịch C sẽ chấp nhận hàm với typedef tại chỗ; Trình biên dịch C++ không yêu cầu nó. –

2
enum Foo 
{ 
    BAR, 
    BAZ 
}; 

Trong C, kiểu trả về phải có enum trước nó. Và khi bạn sử dụng các giá trị enum riêng lẻ, bạn không đủ điều kiện cho chúng theo bất kỳ cách nào.

enum Foo testFunc() 
{ 
    enum Foo temp = BAR; 
    temp = BAZ; 
    return temp; 
} 
Các vấn đề liên quan