Вы вызвали сравнения в вашем макросе:
APCS_RSCC == client
Это будет работать, только если само значение APCS_RSCC
является действительным C идентификатором.Препроцессор не разрешает подобные сравнения, но оставляет их компилятору.APCS_RSCC тогда может быть другим макросом, который разрешается в некоторый тип указателя (например, в структуру, содержащую несколько адресов), или просто в какой-то голый адрес (APCS_RSCC_RSCC_RSC_REG_BASE
затем может преобразовываться во что-то вроде (APCS_RSCC->RSCC_RSC_REG_BASE)
или (APCS_RSCC + RSCC_RSC_REG_BASE)
. Именование, тем не менее, не дает мне впечатления от таких определений ...
Конкатенация теперь была бы подходящим способом:
#define RSC_HWIO_INXFI(client,drvID,reg,index,field) \
HWIO_INXFI( \
client##_RSCC_RSC_REG_BASE + RSC_DRV_OFFSET(drvID), \
client##_##reg,index,field \
) \
Хорошо, теперь вы сказали мне вкомментарии о том, что этот макрос не компилировался. При условии, что оригинальный макрос работал, странно, поскольку вы объединяли его на одном уровне:
#define RSC_HWIO_INXFI(client,drvID,reg,index,field) \
HWIO_INXFI( \
(APCS_RSCC_RSCC_RSC_REG_BASE + RSC_DRV_OFFSET(drvID)), \
APCS_RSCC_##reg, index, field \
)
// ^^
Вы можете обойти проблему путем косвенного объединения (аналогично строковому преобразованию), вы уже встречали эти макросы?):
#define RSC_HWIO_INXFI(client, drvID, reg, index, field) \
HWIO_INXFI( \
CONCAT3(client, _, RSCC_RSC_REG_BASE) + RSC_DRV_OFFSET(drvID), \
CONCAT3(client, _, reg), index, field \
)
#define CONCAT3(X, Y, Z) X##Y##Z