2010-05-07 33 views
5
typedef enum BeNeLux 
{ 
    BELGIUM, 
    NETHERLANDS, 
    LUXEMBURG 
} _ASSOCIATIONS_ BeNeLux; 

Khi tôi cố gắng biên dịch điều này với trình biên dịch C++, tôi gặp lỗi, nhưng có vẻ như nó hoạt động tốt với trình biên dịch C. Vì vậy, đây là câu hỏi. Có thể đóng gói một enum trong C + +, hoặc ai đó có thể nhìn thấy lý do tại sao tôi sẽ nhận được lỗi?C++ đóng một typedef enum

Lỗi này là:

"dấu chấm phẩy mất tích sau khi tuyên bố Benelux".

Tôi biết, sau khi kiểm tra và kiểm tra lại, chắc chắn có dấu chấm phẩy ở đó và ở bất kỳ nơi nào được yêu cầu trong phần còn lại của mã.

Hợp đồng bổ sung:

_PACKAGE_ chỉ là một ví dụ. Tôi đang đổi tên nó.

_ASSOCIATIONS_ không phải là một loại Benelux:

#define _ASSOCIATIONS_ __attribute__((packed))

Mã này được iffed, nhưng chỉ để chắc chắn rằng nó là GNU C/C++.

#if defined (__GNUC__) 
#define _ASSOCIATIONS_ __attribute__((packed)) 
#else 
#define _ASSOCIATIONS_ 

Điều này có gây ra sự cố không? Tôi nghĩ (GNUC) làm việc cho cả hai C và C++

Phụ Lục 2:

Tôi thậm chí đã cố gắng

#ifdef __cplusplus 
extern "C" { 
#endif 

    typedef enum BeNeLux 
    { 
     BELGIUM, 
     NETHERLANDS, 
     LUXEMBURG 
    } _ASSOCIATIONS_ BeNeLux; 

#ifdef __cplusplus 
} 
#endif 

Không có niềm vui. Bất kỳ ai?

Lưu ý: -fort-enums không phải là khả năng; tìm kiếm một giải pháp có lập trình.

+2

'_PACKAGE_' có nghĩa là gì? – wilhelmtell

+0

Đây là tính năng không chuẩn. Bạn đang sử dụng trình biên dịch C nào? – Potatoswatter

+0

Sử dụng gcc 3.3.5 hoặc thấp hơn (phải sử dụng phiên bản cũ hơn) – Sagar

Trả lời

1

Tôi không nghĩ rằng có một cái gì đó mà không chính xác những gì bạn muốn ở đây. Tôi cho rằng bạn đang cố gắng tạo ra một loại nhỏ nhất cho phạm vi của enum.

Nếu bạn cần loại tầm kiểm soát, tôi muốn giới thiệu một cái gì đó như thế này:

typedef unsigned char BeNeLux; 
static const BeNeLux BELGIUM = 0; 
static const BeNeLux NETHERLANDS = 1; 
static const BeNeLux LUXEMBURG = 2; 

không phải là khá đẹp và có thể là một chút ít loại an toàn. Nhưng có hiệu quả mà bạn muốn. sizeof(BeNeLux) == 1 và bạn có hằng số được đặt tên cho tất cả các giá trị trong phạm vi. Một trình biên dịch tốt thậm chí sẽ không phân bổ một biến cho các giá trị số nguyên static const miễn là bạn không bao giờ cố gắng sử dụng địa chỉ của nó.

+0

Cảm ơn bạn! Điều đó làm việc awesomely: D – Sagar

0

Tôi cho rằng bạn đang sử dụng GCC và G ++. Mã này cũng biên dịch tốt với tôi. Thật đáng ngạc nhiên khi thấy một tính năng như vậy biến mất khi bật C++ trên bất kỳ trình biên dịch cụ thể nào.

Đảm bảo rằng #define của bạn không phải là #if 'được viết cho mã C++, ví dụ: #ifndef __cplusplus.

Hãy thử g++ -E để xem đầu ra bộ tiền xử lý và xác minh rằng xuất hiện #define.

Ngoài ra, ngay cả đối với macro tiền xử lý, tên bắt đầu bằng dấu gạch dưới và chữ hoa hoặc hai dấu gạch dưới được dành riêng cho trình biên dịch và thư viện. Nếu bạn phải có macro, PACKED có thể là tên tốt nhất cho nó.

+0

Đã thêm mã đó trực tiếp mà không cần #ifs và nó vẫn không hoạt động. – Sagar

+0

@Sagar: thử cả 'gcc -v' và' g ++ -v' để đảm bảo bạn đang nhận được cùng một phiên bản của cả hai. – Potatoswatter

+0

Theo sách hướng dẫn http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_5.html#SEC105, điều này sẽ hoạt động ngay cả trong GCC 2.95. – Potatoswatter

0

Trong C++, bạn không cần typedef. Chỉ cần bắt đầu với enum BeNeLux. Cũng có thể (tôi không bao giờ có thể nhớ) tuyên bố loại và biến có cùng số nhận dạng có thể không hợp pháp bằng một trong các ngôn ngữ.

+0

phụ lục làm rõ ràng đó không phải là những gì anh ta muốn. Khai báo loại và định danh đồng thời là không thể trong cả hai ngôn ngữ. – Potatoswatter

+0

Ý tôi là, việc khai báo 'typedef' và định danh đồng thời là không thể trong cả hai. – Potatoswatter

+0

@Potatoswatter: Huh? –

0
enum BeNeLux 
{ 
    BELGIUM, 
    NETHERLANDS, 
    LUXEMBURG 
}; 

Đây là những gì được mong đợi của mã C++.

+0

phụ lục làm rõ ràng đó không phải là những gì anh ta muốn. – Potatoswatter

+0

Không, không. Nếu anh ta chỉ sử dụng cái này, thì anh ta sẽ kết thúc. – Puppy

+0

No. Câu hỏi đặt ra là "typedef enum" và đóng gói thuộc tính. Tôi biết enum BeNeLux sẽ làm việc, nhưng đó không phải là những gì tôi cần. – Sagar

1
#if defined (__GNUC__) 
# if defined (__cplusplus) 
#  define _ASSOCIATIONS_(X) __attribute__((packed)) 
# else 
#  define _ASSOCIATIONS_(X) __attribute__((packed)) X 
# endif 
#else 
# if defined (__cplusplus) 
#  define _ASSOCIATIONS_(X) 
# else 
#  define _ASSOCIATIONS_(X) X 
# endif 
#endif 

typdef enum BeNeLux { 
    BELGIUM, 
    NETHERLANDS, 
    LUXEMBURG 
} _ASSOCIATIONS_ (BeNeLux); 

Điều này dường như biên dịch trong tôi g++ (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4)

+0

Hi Meera, nó hoạt động cho chúng tôi với phiên bản g ++ trên 4 quá. Vấn đề là chúng ta phải sử dụng phiên bản 3.3.5 hoặc thấp hơn (ở trên ý kiến). – Sagar

+0

Tôi đã thực hiện một lần thử khác ... http://stackoverflow.com/questions/2791739/c-packing-a-typedef-enum/2916024#2916024 – Meera

1

Không có bước đột phá thực sự nào ở đây. Tôi chỉ sắp xếp lại mọi thứ với hy vọng rằng trình biên dịch của bạn sẽ tốt hơn. Tôi không có phiên bản gcc hoặc g ++ của bạn nên tôi không thể kiểm tra với phiên bản đó. Tôi đã chạy nó thông qua phiên bản 3.4.5 gcc và g ++ (mingw đặc biệt) mà cả hai cảnh báo 'packed' attribute ignored khi đặt hàng như mã của bạn, nhưng không phàn nàn về tôi.

#ifdef __GNUC__ 
#define attribute(x) __attribute__((x)); 
#else 
#define attribute(x) 
#endif 


#ifdef __cplusplus 
extern "C" { 
#endif 

enum BeNeLux 
{ 
    BELGIUM, 
    NETHERLANDS, 
    LUXEMBURG 
} attribute(packed); 
// I declared attribute to look like a f() so that it would not look like I was 
// declaring a variable here. 

#ifndef __cplusplus 
typedef enum BeNeLux BeNeLux; // the typedef is separated into a separate stmt 
#else 
} 
#endif 
0
#if defined (__GNUC__) 

# if defined (__cplusplus) 
#  define ENUM enum 
# else 
#  define ENUM typedef enum 
# endif 

# if defined (__cplusplus) 
#  define _ASSOCIATIONS_(X) __attribute__((packed)) 
# else 
#  define _ASSOCIATIONS_(X) __attribute__((packed)) X 
# endif 
#else 
# if defined (__cplusplus) 
#  define _ASSOCIATIONS_(X) 
# else 
#  define _ASSOCIATIONS_(X) X 
# endif 
#endif 

ENUM BeNeLux { 
    BELGIUM, 
    NETHERLANDS, 
    LUXEMBURG 
} _ASSOCIATIONS_ (BeNeLux); 

đoạn khác. xem mới #define ENUM

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