Sunday, March 6, 2022

[c] 巨集生成程式碼

巨集實際的作用: generate (產生/生成) 程式碼。

 

#define DECLARE_OBJECT(name) \

struct __##name##_node; \

typedef struct __##name##_node *name##_node; \

struct __##name##_node { \

name element; \

name##_node next; \

}; \

void append_##name(const name *X, name##_node *list); \

void delete_##name##_list(name##_node *list);


DECLARE_OBJECT(light)

DECLARE_OBJECT(rectangular)

DECLARE_OBJECT(sphere)


light 在 DECLARE_OBJECT(light) 中會取代 name,因此會產生以下程式碼:

struct __light_node;

typedef struct __light_node *light_node;

struct __light_node { light element; light_node next; };

void append_light(const light *X, light_node *list);

void delete_light_list(light_node *list);


可用 gcc -E -P 觀察輸出:



typedef enum { NORTH, SOUTH, EAST, WEST} Direction;

typedef struct {

    char *description;

    int (*init)(void *self);

    void (*describe)(void *self);

    void (*destroy)(void *self);

    void *(*move)(void *self, Direction direction);

    int (*attack)(void *self, int damage);

} Object;

int Object_init(void *self);

void Object_destroy(void *self);

void Object_describe(void *self);

void *Object_move(void *self, Direction direction);

int Object_attack(void *self, int damage);

void *Object_new(size_t size, Object proto, char *description);

#define NEW(T, N) Object_new(sizeof(T), T##Proto, N)

#define _(N) proto.N

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能