Как определить директиву как другую директиву в языке Си?
Как я могу определить директиву как другую директиву в языке 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 ответа:
Невозможно создать собственные директивы препроцессора. Директива
#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];
(отрицательные размеры массива запрещены).