2012-06-30 41 views
5

Tôi phải viết một số hằng số trong các tệp khác nhau với một số id nguyên. Ví dụ:Giá trị nguyên trong thời gian biên dịch

#define MESSAGE_FIRST 0 

Trong tập tin khác:

#define MESSAGE_ANOTHER 1 

Bất kỳ cách để có được id tự động trong thời gian biên dịch? Một cái gì đó như:

#define MESSAGE_AUTO GetNextId() 

Tôi không thể sử dụng enums ở đây vì chỉ thị này sẽ ở các tệp khác nhau.

Cảm ơn.

p.s. GCC, Linux

+0

Tiêu chuẩn không có thứ gì đó giống như \ _ \ _ COUNTER \ _ \ _ (tương tự như \ _ \ _ LINE \ _ \ _) AFAIK. p.s. Trong bộ tiền xử lý của riêng tôi, tôi có cái này. –

+0

Tôi không thể nghĩ ra bất kỳ cách nào để làm điều đó ngoài việc tạo mã bên ngoài. Nhưng có thể nếu bạn đưa ra mô tả kỹ lưỡng hơn về vấn đề thực tế bạn đang cố giải quyết, chúng tôi có thể cung cấp cho bạn giải pháp tốt hơn. –

+1

Chúng có phải nằm trong các tệp khác nhau không? Hoặc tất cả chúng có thể bao gồm một tệp tiêu đề duy nhất có các giá trị này không? – Matt

Trả lời

5

Bạn có thể làm một thời gian biên dịch ngược, với thừa kế và chức năng quá tải:

template<unsigned int n> struct Count { bool data[n]; }; 
template<int n> struct Counter : public Counter<n-1> {}; 
template<> struct Counter<0> {}; 
Count<1> GetCount(Counter<1>); 

#define MAX_COUNTER_NUM 64 
#define COUNTER_VALUE (sizeof(GetCount(Counter<MAX_COUNTER_NUM + 1>()))/sizeof(bool)) 
#define INC_COUNTER Count<COUNTER_VALUE + 1> GetCount(Counter<COUNTER_VALUE + 1>); 

Bạn có thể thấy nó hoạt động here. Cũng làm việc với msvc.

1

Bạn nói rằng bạn đang sử dụng GCC. GCC có macro (AFAIK trên mỗi tệp) được gọi là __COUNTER__ tăng dần sau mỗi lần sử dụng.

Lưu ý rằng đây là phần mở rộng và không được bao gồm trong tiêu chuẩn C++.

Một lựa chọn khác là sử dụng một enum:

enum { 
    FIRST = 0, 
    SECOND, 
    THIRD 
}; 

Hoặc bạn có thể làm điều này bằng tay sử dụng chỉ thị tiền xử lý như thế này:

#define FIRST 0 
#define SECOND (1 + FIRST) 
#define THIRD (1 + SECOND) 
+0

Điều gì về mẹo mới nhất: Điều này rất hữu ích khi tất cả mọi thứ là một tập tin, tôi cần trong khác nhau và một vài lập trình viên sẽ chỉnh sửa mã này để xung đột có thể xảy ra. – Ockonal

+2

Vui lòng sử dụng parens khi xác định SECOND và THIRD. – robert

+0

@robert: Bạn nói đúng, đã sửa. – orlp

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