[ad_1]
Kompiler GNU mendukung fitur __attribute__(section…) yang dapat menempatkan metode atau variabel ke dalam bagian tertentu dan membuat kode menjadi sederhana.
Tampaknya menggunakan beberapa kata kunci kompiler untuk menyelesaikan pengikatan data dan pemetaan pesan.
Apa yang saya coba:
Kode berikut adalah contohnya
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 *******************/
Bagaimana cara membuatnya berfungsi di MSVC?
Solusi 1
Melihat Opsi Kompiler Diurutkan berdasarkan Kategori | Microsoft Belajar[^] Dan Arahan Pragma dan kata kunci __pragma dan _Pragma | Microsoft Belajar[^] untuk berbagai opsi dan pernyataan kontrol.
[ad_2]
コメント