Слишком много аргументов в вызове макроса - PullRequest
0 голосов
/ 25 мая 2018

Когда я определяю приведенный ниже макрос, код компилируется нормально:

 #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)    \
                    (APCS_RSCC         == client ? HWIO_INXFI((APCS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), APCS_RSCC_##reg,index,field) : \
                    (MSS_RSCC          == client ? HWIO_INXFI((MSS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), MSS_RSCC_##reg,index,field) : \
                    (MSS_QDSP6SS_RSCC  == client ? HWIO_INXFI((MSS_QDSP6SS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), MSS_QDSP6SS_RSCC_##reg,index,field) : \
                    (AOP_RSCC          == client ? HWIO_INXFI((AOP_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), AOP_RSCC_##reg,index,field) : HWIO_INXFI((APCS_RSCC_RSCC_RSC_REG_BASE+RSC_DRV_OFFSET(drvID)), APCS_RSCC_##reg,index,field)))))

Следует отметить, что ошибка возникает только для последних 3 клиентов, т.е. MSS_RSCC, MSS_QDSP6SS_RSCC & AOP_RSCC.Не для первого (APCS_RSCC)

Любая подсказка?

С уважением,

1 Ответ

0 голосов
/ 28 мая 2018

Вы вызвали сравнения в вашем макросе:

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
...