Я занимаюсь разработкой приложения, которое взаимодействует с оборудованием с помощью 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(®ister_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;
}