¿Existe alguna característica compatible como arm __attribute__(section) en MSVC?

programación

[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

[ad_2]

コメント

Título y URL copiados