Немногие программисты на Си пользуются преимуществами #undef
, специально переопределяя макрос для ваших текущих целей. Это позволяет вам настроить все ваши данные в одной читаемой таблице, которую можно обновлять и изменять в 1 месте.
#define FUNCTION_MAP { \
MAP(ID_NOP_FUNCTION, NULL), \
MAP(ID_PRINT_FUNCTION, Print), \
MAP(ID_READ_FUNCTION, Read), \
MAP(ID_WRITE_FUNCTION, Write), \
MAP(ID_PROCESS_FUNCTION, Process), \
}
#define MAP(x,y) x
enum function_enums FUNCTION_MAP;
#undef MAP
#define MAP(x,y) y
Function_Ptr Export_Function_Table[] = FUNCTION_MAP;
#undef MAP
но подождите, это еще не все из-за низкой и низкой цены в $ 0 с бесплатным S & H, вы можете выполнять все свои функции header Mumbo Jumbo все в одном месте.
#define FUNCTION_MAP \
/* ENUM Function, return, Arguments ... */ \
MAP(ID_PRINT_FUNCTION, Print, int, char *fmt, va_list *ap ) \
MAP(ID_READ_FUNCTION, Read, int, int fd, char *buf, size_t len) \
MAP(ID_WRITE_FUNCTION, Write, int, int fd, char *buf, size_t len) \
MAP(ID_PROCESS_FUNCTION, Process,int, int )
//function enums
#define MAP(x,y,...) x,
enum function_enums { FUNCTION_MAP };
#undef MAP
//function pre-definitions with unspecified number of args for function table
#define MAP(x,fn_name,ret,...) ret fn_name();
FUNCTION_MAP
#undef MAP
//function tables with unspecified number of arguments
#define MAP(x,y,...) y,
typedef int (*Function_Ptr)();
Function_Ptr Export_Function_Table[] = { FUNCTION_MAP };
#undef MAP
//function definitions with actual parameter types
#define MAP(x,fn_name,ret,...) ret fn_name(__VA_ARGS__);
FUNCTION_MAP
#undef MAP
//function strings ... just in case we want to print them
#define MAP(x,y,...) #y,
const char *function_strings[] = { FUNCTION_MAP };
#undef MAP
//function enum strings ... just in case we want to print them
#define MAP(x,y,...) #x,
const char *function_enum_strings[] = { FUNCTION_MAP };
#undef MAP
#undef FUNCTION_MAP
Теперь вы можете просто добавить каждую новую функцию в одном месте вверху этого заголовка, предпочтительно в конец FUNCTION_MAP, если вы хотите сохранить обратную совместимость как библиотеку ... в противном случае вы можете просто перечислить их по алфавиту. *