реализация вложенного макроса с оператором # и ## - PullRequest
0 голосов
/ 03 июня 2019

Я пишу обобщенную функцию, которая примет имя макроса и выполнит правильную функцию.

Я пишу функцию, которая примет имя функции из макроса и объединит его и выполнит функцию. Я добавляю этот заголовокфайл в моей рабочей области, где более одного файла c использует эту логику реализации макроса для выполнения моего кода. Но я получаю ошибку во время выполнения кода.

#define STR(name) #name

int convert_f14u18(int a,int b);
int convert_f14s18(int a,int b);

#define VAL_F 14
#define DATA_SIGN u
#define VAL_NUM 18

#define EXECUTE_FUN_NAME(a,b,c,d,e)  a##b##c##d##e
#define EXECUTE_STATEMENT(a,b,c,d,e,f)  b##c##d##e#f=EXECUTE_FUN_NAME(a,b,c,d,e)

typedef int u32;
u32 add_u32(u32 a,u32 b);

int main() {

    //Testing of string macro
    printf(STR(Hello));

    int numa = 10;
    int numb = 20;
    int numc = 30;


    //int z1 = EXECUTE_FUN_NAME(convert_,f,14,u,18)(numa,numb);
    int z1 = EXECUTE_FUN_NAME(convert_,f,VAL_F,DATA_SIGN,VAL_NUM)(numa,numb);

    //int z2 = EXECUTE_FUN_NAME(convert_,f,14,s,18)(numa,numc);
    int z2 = EXECUTE_FUN_NAME(convert_,f,VAL_F,DATA_SIGN,VAL_NUM)(numa,numc);


    printf("\nz1 %d\n",z1);
    printf("z2 %d\n",z2);


    return 0;
}


int convert_f14u18(int a,int b){
    return (a+b);
}
int convert_f14s18(int a,int b){
    return (a+b);
}

u32 add_u32(u32 a,u32 b){
    return (a+b);
}
Error:../main.cpp: In function ‘int main()’:
../main.cpp:37:76: error: ‘convert_fVAL_FDATA_SIGNVAL_NUM’ was not  declared in this scope
 int z1 = EXECUTE_FUN_NAME(convert_,f,VAL_F,DATA_SIGN,VAL_NUM)(numa,numb);

Ожидаемый результат: Если я откомментирую вышеприведенные строки фактического оператора макроса в основных операторах и прокомментирую текущие операторы макроса, я смогу запустить код.Но я хочу, чтобы мой код работал с текущей логикой.

1 Ответ

4 голосов
/ 03 июня 2019

При замене макроса C сначала заменяет каждый параметр своим аргументом. Таким образом, аргумент c заменяется, например, VAL_F. Затем он применяет оператор ##, который выдает convert_fVAL_FDATA_SIGNVAL_NUM в этом примере. Затем C проверяет результат на наличие дополнительных макросов для замены. Однако в этот момент аргументы, такие как VAL_F, были объединены в один токен с ## и больше не являются отдельными токенами, которые будут заменены.

Чтобы справиться с этим, используйте один макрос для замены аргументов, затем используйте другой макрос для применения оператора ##. Изменения:

#define EXECUTE_FUN_NAME(a,b,c,d,e)  a##b##c##d##e

до:

#define EXECUTE_FUN_NAME_HELPER(a, b, c, d, e)  a##b##c##d##e
#define EXECUTE_FUN_NAME(a, b, c, d, e)         EXECUTE_FUN_NAME_HELPER(a, b, c, d, e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...