Existe-t-il des fonctionnalités complémentaires telles que arm __attribute__(section) dans MSVC ?

la programmation


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

Solution 2

Par curiosité : que fais-tu pour que tu aies besoin de faire ça ?

コメント

タイトルとURLをコピーしました