2010-11-26 2 views
1

У меня есть проблемы с этой попыткой макроса:#define ISR (х) #pragma ISR = х

#define ISR(x) #pragma isr=x 

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

ответ

5

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

От 6.10.9 от C99 Стандарта:

Унарного оператор вида: строки-буквальный) обрабатываются следующим образом: Строка литерала destringized, удалив префикс L , если он присутствует, удаляет ведущую и конечную двойные кавычки, заменяя каждую escape-последовательность \" двойной кавычкой и заменяя каждую escape-последовательность \\ одним обратным слэшем. Полученная последовательность символов обрабатывается через фазу 3 трансляции для получения токенов предварительной обработки, которые выполняются так, как если бы они были pp-tokens в директиве прагмы. Исходные четыре токена предварительной обработки в унарном операторном выражении удаляются.

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

#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

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

#define ISR(x) #pragma isr=x 

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

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

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

Больше ссылки на _Pragma here

+0

Существует небольшая проблема с определением `ISR`. Аргумент `_Pragma` должен быть единственным строковым литералом. – 2010-11-26 17:15:18

Смежные вопросы