#define woes - макрос, которого нет - PullRequest
3 голосов
/ 15 июля 2011

Я пытаюсь сделать что-то вроде:

#define __attribute__((aligned(2))) __attribute__((space(prog),aligned(2)))

но компилятор выдает:

 error: "(" may not appear in macro parameter list

Вопросы: что дает?Как мне заменить буквальный текст, без колокольчиков, без излишеств?

Ответы [ 2 ]

5 голосов
/ 15 июля 2011

Как только вы начинаете с круглых скобок, вы определяете макрос с аргументами, и это связано с некоторыми правилами.

Таким образом, вы можете сделать, например:

#define succ(x) (x + 1)

Но вы не можете сделать:

#define pred(x + 1) x

Препроцессор выполняет только очень ограниченный набор сопоставления с образцом.

То, что вы могли бы сделать вместо этого, выглядит примерно так:

#define __aligned2__ __attribute__((space(prog),aligned(2)))

И используйте вместо этого определение.Если этого недостаточно для ваших нужд, вам нужно выполнить некоторую пользовательскую предварительную обработку, используя вместо этого sed.

4 голосов
/ 15 июля 2011

Это невозможно с препроцессором C. Вы можете определить «literal txt replace», как вы выразились, только в том случае, если текст, который вы хотите заменить, является одним идентификатором («объектоподобный макрос» на стандартном языке C). То, что вы написали, заставляет препроцессор думать, что вы пытаетесь определить «подобный функции макрос» с параметром с именем «(aligned(2))», что является синтаксической ошибкой.

Я бы справился с этой проблемой, обернув всю конструкцию __attribute__ в объектоподобный макрос:

#if appropriate condition
#define ATTRIBUTE_ALIGNED_2 __attribute__((space(prog),aligned(2)))
#else
#define ATTRIBUTE_ALIGNED_2 __attribute__((aligned(2)))
#endif

, а затем заменить __attribute__((aligned(2))) на ATTRIBUTE_ALIGNED_2 во всем исходном коде.

...