[ad_1]
Le compilateur GNU prend en charge les fonctionnalités __attribute__(section…) qui pourraient placer la méthode ou les variables dans des sections spécifiées et simplifier le code.
Il semble utiliser des mots-clés conformes pour terminer les liaisons de données et les mappages de messages.
Ce que j’ai essayé :
Le code suivant est un exemple
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 *******************/
Comment le faire fonctionner dans MSVC ?
Solution 1
Voir Options du compilateur répertoriées par catégorie | Microsoft Apprendre[^] et Directives Pragma et mots-clés __pragma et _Pragma | Microsoft Apprendre[^] pour les différentes options et instructions de contrôle.
Solution 2
Par curiosité : que fais-tu pour que tu aies besoin de faire ça ?
[ad_2]
コメント