C Макрос не раскрывается в макросе - PullRequest
0 голосов
/ 04 мая 2020

Я занимаюсь разработкой приложения, которое взаимодействует с оборудованием с помощью ioctls. Я написал более низкий уровень API для выполнения операций устройства. Я написал несколько макросов как обертки. следующим образом.

WRITE_REGISTER(99, REGISTER_ADDRESS( 10, SCKT0_REG) );

с g cc -E, я заметил, что внутренний макрос не расширяется. Не могли бы вы помочь мне решить проблему?

Ниже приведен фрагмент компиляции исходного кода.

#include <stdio.h>
#include <string.h>

#define MAX_REG_NAME_LENGTH                     32
#define MODULE_SEQUENCER                        20
#define SCKT0_REG                               11

struct register_struct
{
    unsigned int reg_addr;
    unsigned int reg_value;
    char    reg_name [MAX_REG_NAME_LENGTH];
    char    module_name[MAX_REG_NAME_LENGTH] ;

} register_st;


#define GET_REGISTER_ADDRESS(module_index, register_offset)                                                     \
                (module_index * (1 << BITS_PER_MODULE) + register_offset)                                       \

#define REGISTER_ADDRESS_(module_index, register_offset)                                              \
                {                                                                                               \
                    memset(&register_st, 0, sizeof(struct register_struct));                                    \
                    register_st.reg_addr = GET_REGISTER_ADDRESS(module_index, register_offset);                 \
                    memcpy(register_st.reg_name, STR(register_offset), sizeof(STR(register_offset)));           \
                    memcpy(register_st.module_name, STR(MODULE_SEQUENCER), sizeof(STR(MODULE_SEQUENCER)));       \
                }                                                                                               \

#define REGISTER_ADDRESS(x, y) REGISTER_ADDRESS_(x, y)

#define WRITE_REGISTER(register_value, register_offset)                 \
                     ({                                                 \
                        register_st.reg_value = register_value;         \
                     })                                                 \

int main()
{
    unsigned int uiValue = 0;

    WRITE_REGISTER(99, REGISTER_ADDRESS( 10, SCKT0_REG) );

    return 0;
}


...