[ad_1]
Trình biên dịch GNU hỗ trợ các tính năng __attribute__(section…) có thể đặt phương thức hoặc biến vào các phần được chỉ định và làm cho mã trở nên đơn giản.
Có vẻ như sử dụng một số từ khóa trình biên dịch để hoàn tất việc liên kết dữ liệu và ánh xạ thông báo.
Những gì tôi đã thử:
Đoạn mã sau đây là một mẫu
C++
#include <stdio.h> #include <string.h> #include <stdint.h> typedef struct _handler{ const char* msg_name; void*(*func)(void*,size_t); }Handler_t; struct msg{ char msg_name[32]; size_t msg_len; uint8_t msg_data[0]; }; //gcc __attribute__ #define DECLARE_HANDLER(msg_name,func) __attribute__((section("my_msg_handler"))) \ Handler_t msg_name##_handler={\ #msg_name,\ func\ }; //dispath extern Handler_t __start_my_msg_handler; extern Handler_t __stop_my_msg_handler; int dispath(struct msg* msg) { int i; Handler_t* handler=&__start_my_msg_handler; for(i=0;i<&__stop_my_msg_handler-&__start_my_msg_handler;i++) { if(!strncmp(msg->msg_name,handler[i].msg_name,32)) { handler[i].func(msg->msg_data,msg->msg_len); break; } } return 0; } /************* End of msg dispath frame *******************/ /**********************************************************/ /************************ test ********************/ void* handler_test(void* msg_data,size_t len) { printf("%s msg data:%s,msg length:%d\n",__func__,(char*)msg_data,len); return 0; } DECLARE_HANDLER(test,handler_test); int main(void) { uint8_t _msg[64]={0}; struct msg* my_msg=(struct msg*)_msg; strcpy(my_msg->msg_name,"test"); strcpy((char*)my_msg->msg_data,"Hello , My msg test."); my_msg->msg_len=strlen((char*)my_msg->msg_data)+1; dispath(my_msg); return 0; } /************************ test end *******************/
Làm cách nào để nó hoạt động trong MSVC?
Giải pháp 1
Nhìn thấy Tùy chọn trình biên dịch được liệt kê theo danh mục | Microsoft Tìm hiểu[^] Và Chỉ thị Pragma và từ khóa __pragma và _Pragma | Microsoft Tìm hiểu[^] cho các tùy chọn và câu lệnh điều khiển khác nhau.
[ad_2]
コメント