Как определить директиву как другую директиву в языке Си?


Как я могу определить директиву как другую директиву в языке C ?

Пример: Я хочу определить

#define #warning #warn

Я получаю ошибку

error #41: expected an identifier

Для составителей и задач, например, некоторые компиляторы распознают #warning и другие признают #warn.

У меня уже есть способ сделать это, но я хочу сделать его универсальным

#if PLATFORMS_TOOLCHAIN == PLATFORMS_ticgt
  #warn "RAM is not initialized at startup, test will possibly fail"
#else
  #warning "RAM is not initialized at startup, test will possibly fail"
#endif
2 2

2 ответа:

Невозможно создать собственные директивы препроцессора. Директива #define позволяет определять только новые исходные символы.

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

В общем случае это невозможно, однако вы можете эффективно генерировать Директивы #pragma с помощью _Pragma keyword.

#define PRAGMA(...) _Pragma(#__VA_ARGS__)
PRAGMA(message "my message")
//as if you wrote: #pragma message "my message"

Имея это в виду, ваш компилятор может иметь прагмы, которые позволяют вам эмулировать #warn или #error (#pragma GCC warning "message" или #pragma GCC error "message").

Если у вашего компилятора нет таких прагм, вы всегда можете потерпеть неудачу при компиляции, расширяясь до чего-то относительно контекстно-свободного, что не компилируется, например, char ERROR[-1]; (отрицательные размеры массива запрещены).