2010-10-15 25 views
6

Tôi đang sử dụng macro tiền xử lý để khai báo một số biến lặp đi lặp lại, cụ thể:C++ vĩ mô - tận dụng chuỗi

QuitCallbackType quitCallback; 
LossCallbackType lossCallback; 
PauseCallbackType pauseCallback; 
KeyCallbackType keyCallback; 
MouseCallbackType mouseCallback;

Tôi muốn sử dụng một macro tiền xử lý để làm điều đó, a la


CREATE_CALLBACK_STORAGE(quit) 
CREATE_CALLBACK_STORAGE(loss) 
CREATE_CALLBACK_STORAGE(pause) 
CREATE_CALLBACK_STORAGE(key) 
CREATE_CALLBACK_STORAGE(mouse) 

nơi mà về cơ bản nó sẽ như thế này:

#define CREATE_CALLBACK_STORAGE(x) capitalize(x)##CallbackType x##CallBack;

Có cách nào để làm điều này, để tôi không phải vượt qua cả chữ hoa d và các phiên bản chữ thường của mỗi tên?

Tôi nhận ra rằng không cần gõ nhiều để sử dụng macro, nhưng vấn đề chính nó đã bắt đầu lôi cuốn tôi.

+2

Macro cho một lược đồ đặt tên đơn giản như vậy có vẻ khó hiểu hơn là hữu ích. – GManNickG

+4

Chết bởi Macros! –

Trả lời

4

Trình tiền xử lý macro không có khả năng lấy dữ liệu hoặc viết hoa. Lấy làm tiếc.

Nếu bạn có thể thay đổi lược đồ đặt tên, bạn có thể có nhiều thành công hơn. Ví dụ:

QuitCallbackType _QuitCallback; 

Edit: Tôi đã được cảnh báo không nên dùng dấu gạch dưới hàng đầu, nhưng ý tưởng vẫn được áp dụng:

QuitCallbackType callbackQuit; 
+0

+1 cho sơ đồ thay thế. Trong thực tế, nếu OP đang sử dụng macro để xác định các biến, tại sao không sử dụng macro khác để truy cập chúng, hãy nói '#define CALLBACK (x) _ ## x ## Gọi lại ' – casablanca

+6

@Mark: Tên bắt đầu bằng dấu gạch dưới theo sau là chữ hoa thư, như '_QuitCallback' trong ví dụ của bạn, được dành riêng cho việc triển khai, ở mọi nơi. Điều đó cũng đi cho tên với hai dấu gạch dưới liên tiếp. Nhân tiện, vì tôi đã nhận xét về một câu trả lời khác của bạn chỉ nửa giờ trước, nên tôi không "theo dõi" bạn. :-) Tôi sẽ chỉ xóa nhận xét này sau khi chỉnh sửa ur. Chúc mừng, –

+0

@Alf P. Steinbach: "Nhân tiện, vì tôi đã nhận xét về một câu trả lời khác của bạn chỉ nửa giờ trước, nên tôi không" theo dõi "bạn." Excusatio non petita, accusatio manifesta. ;) –

2

Tôi nghĩ rằng bạn nên bỏ cái dự án ý tưởng của các macro hoàn toàn. Một giải pháp tốt hơn là để tạo ra một cấu trúc dữ liệu đơn giản, chẳng hạn như:

struct CallBacks { 
    QuitCallbackType quit; 
    LossCallbackType loss; 
    PauseCallbackType pause; 
    KeyCallbackType key; 
    MouseCallbackType mouse; 
}; 

Và sử dụng này để thay thế:

CallBacks callback; 

Bạn chỉ có thể sử dụng các thành viên mà bạn muốn:

callback.quit = GetCallback(...); 
someFunc(callback.quit); 
// ect.. 

Nó cũng làm cho các tên biến (theo ý kiến ​​của tôi) một chút rõ ràng hơn.

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