Поддерживаются ли многострочные макросы в GCC

Поддерживаются ли (скомпилированы) многострочные макросы в gcc версии 3.2.4. Я пытаюсь собрать мой исходный код с многострочными макросами на Linux-хосте, используя вышеупомянутую версию gcc. Я получаю ошибку компиляции в макросе, который является многострочным.

      #define YYCOPY(To, From, Count)       \
      do                    \
     {                  \
       YYSIZE_T yyi;                \
       for (yyi = 0; yyi < (Count); yyi++)  \
         (To)[yyi] = (From)[yyi];       \
     }                  \
      while (0)

Если они не поддерживаются, какой обходной путь для этого может помочь преобразование макроса в функцию или другой параметр компилятора?

благодарю вас.

-ОБЪЯВЛЕНИЕ

2 ответа

Обратная косая черта для продолжения макроса является стандартным препроцессором. Проверьте наличие лишних пробелов или других невидимых символов после обратной косой черты.

Спецификация ANSI C требует, чтобы компиляторы поддерживали это - в частности, в стандарте говорится, что если строка заканчивается обратной косой чертой непосредственно перед новой строкой, препроцессор должен обрабатывать эту строку и последующую строку как одну логическую строку, как если бы обе обратные косые черты и новая строка не существует. Если препроцессор этого не делает, он не является соответствующим препроцессором (или, точнее, переводчиком, как его называет стандарт).

GCC стремится максимально соответствовать стандарту ANSI C. Да, он поддерживает многострочные макросы, определенные с помощью обратной косой черты в конце строк.

Причина, по которой вы получаете ошибки компилятора, кроется в другом. Вы не используете макрос правильно. Без публикации точных сообщений об ошибках, которые вы получаете, и кода, который вызывает макрос, невозможно сказать, что вы делаете неправильно.

Другие вопросы по тегам