Поддерживаются ли многострочные макросы в GCC - PullRequest
1 голос
/ 20 января 2010

Поддерживаются ли многострочные макросы (компилируются) в 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)

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

спасибо.

-AD

Ответы [ 2 ]

3 голосов
/ 20 января 2010

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

2 голосов
/ 20 января 2010

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

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

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

...