[ad_1]
يدعم مترجم GNU ميزات __attribute__(section…) التي يمكنها وضع الطريقة أو المتغيرات في أقسام محددة وجعل التعليمات البرمجية بسيطة.
يبدو أنه يستخدم بعض الكلمات الأساسية المتوافقة لإنهاء ربط البيانات وتعيينات الرسائل.
ما حاولت:
التعليمة البرمجية التالية هي عينة
سي ++
#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 *******************/
كيفية جعله يعمل في MSVC؟
الحل 1
يرى خيارات المترجم مدرجة حسب الفئة | مايكروسوفت تعلم[^] و توجيهات Pragma والكلمات الأساسية __pragma و _Pragma | مايكروسوفت تعلم[^] لمختلف الخيارات وبيانات التحكم.
[ad_2]
コメント