Ошибки компиляции при доступе к элементу структуры с использованием строкового имени - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь создать группу функций, которые получают доступ к элементам структуры. Я использую директивы препроцессора # stringify для создания имен функций, заканчивающихся на имени элемента, и внутри этих функций доступ к элементу. Это позволит вызвать несколько простых макросов для создания некоторых очень похожих функций.

При компиляции следующего упрощенного примера я получаю ошибку компилятора

struct test
{
    float tst;
}test;

// Macro that creates callback functions
#define test_float_(varname) \
void test_float_##varname(void) {\
    test.#varname = 0;\
}

test_float_(tst)
error: expected identifier before string constant
 test_float_(tst)
                ^
../protocol.c:66:8: note: in definition of macro 'test_float_'
  test.#varname = 0;\

Если я уберу строку test.#varname = 0;, ошибка исчезнет.
Что я здесь не так делаю?

1 Ответ

2 голосов
/ 30 января 2020

# MacroArgument создает строковый литерал из аргумента макроса.

Ваш код:

struct test
{
    float tst;
}test;

// Macro that creates callback functions
#define test_float_(varname) \
void test_float_##varname(void) {\
    test.#varname = 0;\
}

test_float_(tst)

предварительно обрабатывает (https://gcc.godbolt.org/z/ZkaKaA):

struct test
{
    float tst;
}test;

void test_float_tst(void) { test."tst" = 0;}

Часть test."tst" = 0;, очевидно, является синтаксической ошибкой. Потеря # до varname, и он будет работать.

(Примечание: флаг -E, данный компилятору POSIX C, приводит к тому, что он просто запускает препроцессор в текстовом режиме. найти его полезным при отладке C макросов.)

...