#define QMI_SVC_HDLR(cmdval, hdlr) {cmdval, #hdlr, hdlr}
# 是 C 預處理器的 **字符串化運算符 (Stringizing Operator)**。
// 宏調用
QMI_SVC_HDLR(5, myHandler)
// 預處理後展開為
{5, "myHandler", myHandler}
結構體初始化包含三個字段:數值、處理器名稱字符串、處理器函數指針。
#include
#define QMI_SVC_HDLR(cmdval, hdlr) {cmdval, #hdlr, hdlr}
typedef void (*HandlerFunc)(void);
typedef struct {
int cmd;
const char* name;
HandlerFunc func;
} ServiceHandler;
void handleLogin() { printf("Login handler\n"); }
void handleLogout() { printf("Logout handler\n"); }
int main() {
ServiceHandler handlers[] = {
QMI_SVC_HDLR(100, handleLogin),
QMI_SVC_HDLR(200, handleLogout)
};
for (int i = 0; i < 2; i++) {
printf("Cmd: %d, Name: %s, Func: %p\n",
handlers[i].cmd, handlers[i].name, handlers[i].func);
handlers[i].func();
}
return 0;
}
輸出:
Cmd: 100, Name: handleLogin, Func: 0x...
Login handler
Cmd: 200, Name: handleLogout, Func: 0x...
Logout handler
常與 `#` 配合使用:
#define DECLARE_HANDLER(name) \
void handle_##name() { printf(#name " called\n"); }
DECLARE_HANDLER(Login) // 展開為 void handle_Login() { printf("Login" " called\n"); }
DECLARE_HANDLER(Logout) // 展開為 void handle_Logout() { printf("Logout" " called\n"); }