[ad_1]
GNU コンパイラは、メソッドまたは変数を指定されたセクションに配置してコードを単純にする __attribute__(section…) 機能をサポートしています。
データバインディングとメッセージマッピングを完了するためにいくつかのコンパイラキーワードを使用しているようです。
私が試したこと:
次のコードはサンプルです
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 *******************/
MSVC で機能させるにはどうすればよいですか?
解決策 1
見る コンパイラ オプションのカテゴリ別リスト | Microsoft Learn[^] そして Pragma ディレクティブと __pragma および _Pragma キーワード | Microsoft Learn[^] さまざまなオプションと制御ステートメントについて。
[ad_2]
コメント