#define ISR (x) #pragma isr = x - PullRequest
       3

#define ISR (x) #pragma isr = x

1 голос
/ 26 ноября 2010

У меня проблемы с этой попыткой макроса:

#define ISR(x) #pragma isr=x

не компилируется, потому что пытается заменить #pragma несуществующим параметром. Есть ли способ добиться того, что я пытаюсь сделать? Я бы хотел, чтобы ISR(VEC1) было расширено до #pragma isr=VEC1.

.

Ответы [ 2 ]

5 голосов
/ 26 ноября 2010

Да.Можно определить макрос, который расширяется в директиву прагмы, используя унарный оператор _Pragma.

Начиная с 6.10.9 стандарта C99:

Унарный операторФорма: _Pragma ( строковый литерал ) обрабатывается следующим образом: строковый литерал destringized путем удаления префикса L, если он есть, удаления начального и конечного двойного-квот, заменяя каждую escape-последовательность \" двойной кавычкой и заменяя каждую escape-последовательность \\ одиночной обратной косой чертой.Результирующая последовательность символов обрабатывается в фазе перевода 3 для получения токенов предварительной обработки, которые выполняются так, как если бы они были pp-токенами в директиве pragma.Исходные четыре токена предварительной обработки в выражении унарного оператора удалены.

Примером из Стандарта является:

#define LISTING(x) PRAGMA(listing on #x)
#define PRAGMA(x) _Pragma(#x)
LISTING ( ..\listing.dir )

, что эквивалентно:

#pragma listing on "..\listing.dir"

Следовательно, это то, что вы ищете:

#define PRAGMA(x) _Pragma(#x)
#define ISR(x) PRAGMA(isr=x)
3 голосов
/ 26 ноября 2010

Это не будет работать как в коде

#define ISR(x) #pragma isr=x 

"#" в определении макроса является оператором Stringification. То есть, если перед аргументом стоит #, то он будет приведен в соответствие, иначе оператор # будет проигнорирован. Таким образом, в итоге, чтобы ответить на ваш вопрос, вы не можете сделать это.

Если ваш компилятор реализует C99, вы можете использовать _Pragma вместо этого

#define ISR(X) _Pragma(isr=x)

Подробнее о _Pragma здесь

...