конкатенировать префикс в имени функции с макросом? - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу объединить некоторый макрос в начале имени функции:

#include <stdio.h>

#define PFX mypfx

int PFX##_call() {
    printf("teeeeeeeeest");
}

int main(void)
{
    mypfxcall();
}

Приведенный выше код возвращает ошибку при компиляции.

Как добавить префикс с макросом в имя функции?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Почему бы вам не использовать namespace вместо:

namespace mypfx
{
    int call() {
         printf("teeeeeeeeest");
    }
}

int main(void)
{
    mypfx::call();
}
1 голос
/ 26 сентября 2019

Я не знаю, почему вы хотели бы сделать это (возможно, потому что вы хотите "эмулировать" пространства имен), но, предполагая, что вы находитесь в C, вы можете достичь этого с помощью следующего кода.

#define concat2(X, Y) X ## Y
#define concat(X, Y) concat2(X, Y)
#define pfx(x) concat(pfx_, x)

Использование:

int pfx(sum)(int x, int y) {
    return x + y;
}

int main() {
    printf("%d\n", pfx(sum)(5,4));
}

Примечание: если вы хотите использовать больше вычислительной мощности макроса (не знаю, так ли это у вас), вам следует посетить P99

1 голос
/ 26 сентября 2019

Оператор ## позволяет объединять только две строки внутри другого определения макроса.

Но это:

int PFX##_call()

не является определением макроса, поэтому оно будет расширено до этогонедопустимый C:

int mypfx##_call()

Пример правильного использования:

#define FOO 1
#define BAR 2
#define FB FOO##BAR    // FB will expand to FOOBAR
                       // independently of the macros FOO and BAR

#define BF FOO BAR     // BF will expand to 1 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...