Có bất kỳ tính năng biên dịch nào như arm __attribute__(section) trong MSVC không?

lập trình


Trình biên dịch GNU hỗ trợ các tính năng __attribute__(section…) có thể đặt phương thức hoặc biến vào các phần được chỉ định và làm cho mã trở nên đơn giản.

Có vẻ như sử dụng một số từ khóa trình biên dịch để hoàn tất việc liên kết dữ liệu và ánh xạ thông báo.

Những gì tôi đã thử:

Đoạn mã sau đây là một mẫu

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 *******************/

Làm cách nào để nó hoạt động trong MSVC?

Giải pháp 1

コメント

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