[ad_1]
El compatible con GNU admite las funciones __attribute__(sección…) que podrían colocar métodos o variables en secciones específicas y simplificar el código.
Parece utilizar algunas palabras clave de cumplimiento para finalizar los enlaces de datos y las asignaciones de mensajes.
Lo que he probado:
El siguiente código es un ejemplo.
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 *******************/
¿Cómo hacerlo funcionar en MSVC?
Solución 1
Ver Opciones del compilador enumeradas por categoría | Microsoft aprende[^] y Directivas Pragma y las palabras clave __pragma y _Pragma | Microsoft aprende[^] para las diversas opciones y declaraciones de control.
[ad_2]
コメント