2008-09-24 32 views
14

Giả sử bạn muốn tạo ra một danh sách phù hợp của định danh và chuỗiLàm một cái gì đó cả một định danh C và một chuỗi?

enum 
{ 
NAME_ONE, 
NAME_TWO, 
NAME_THREE 
}; 

myFunction(NAME_ONE, "NAME_ONE"); 
myFunction(NAME_TWO, "NAME_TWO"); 
myFunction(NAME_THREE, "NAME_THREE"); 

..without lặp lại chính mình, và không có/C++ macro tự động tạo mã, sử dụng C

đoán ban đầu:

Bạn có thể thêm một file #include chứa

myDefine(NAME_ONE) 
myDefine(NAME_TWO) 
myDefine(NAME_THREE) 

Sau đó sử dụng nó hai lần như:

#define myDefine(a) a, 
enum { 
#include "definitions" 
} 
#undef myDefine 

#define myDefine(a) myFunc(a, "a"); 
#include "definitions" 
#undef myDefine 

nhưng #define không cho phép bạn đặt thông số trong chuỗi?

Trả lời

24

Đối với #define thứ hai của bạn, bạn cần phải sử dụng toán tử # preprocessor, như thế này:

#define myDefine(a) myFunc(a, #a); 

Đó chuyển đổi đối số thành một chuỗi.

3

Đây là một cách tốt để khai báo tên-list:

#define FOR_ALL_FUNCTIONS(F)\ 
    F(NameOne)\ 
    F(NameTwo)\ 
    F(NameThree)\ 

#define DECLARE_FUNCTION(N)\ 
    void N(); 

#define IMPLEMENT_FUNCTION(N)\ 
    void N(){} 

FOR_ALL_FUNCTIONS(DECLARE_FUNCTION); 
FOR_ALL_FUNCTIONS(IMPLEMENT_FUNCTION); 

Bằng cách này này tên-list có thể được tái sử dụng nhiều lần. Tôi đã sử dụng nó để tạo mẫu các tính năng ngôn ngữ mới, mặc dù không bao giờ kết thúc bằng cách sử dụng chúng. Vì vậy, nếu không có gì khác, họ là một cách tuyệt vời để tìm ra những ngõ cụt trong những phát minh của riêng mình. Tôi tự hỏi nếu đó là bởi vì những gì họ nói: "macro là xấu" ... :)

+1

Tuyệt vời để xem ai đó đang sử dụng tên macro cũng như vậy. Tôi thấy kỹ thuật này rất mạnh mẽ và hữu ích. Shameless plug: http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-string-in-c#202511 – Suma

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