Compiler #warning: вывод значения enum - PullRequest
0 голосов
/ 11 февраля 2020

Я хочу напечатать значение перечисления как #warning или как #pragma message. Я использую typedef enum вместо #define 'значения, поскольку это облегчает редактирование и позволяет вводить параметры функции и возвращаемые значения.

Причина печати: постоянное максимальное значение enum не должно превышать определенное значение, однако я не могу проверить значение непосредственно в коде, поскольку его значения автоматически увеличиваются: typedef enum {a, b, ... az } mytype_t;. В этом примере az должен быть меньше, чем [любой u_int].

Я попытался привести в соответствие значение в соответствии с этой записью , однако это работает только для значений #define 'd. Я попробовал варианты значения enum, но не смог получить фактическое значение для печати, только его имя.

Есть ли способ вывести значение перечисления (или также переменную const) при компиляции? Спасибо.

РЕДАКТИРОВАТЬ: я использую компилятор Microchips XC8 (8 бит) и C99.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Стандарт C не предусматривает способа сообщения значений констант перечисления в макросах препроцессора или других методах времени компиляции. Однако можно проверить, что значение находится в требуемом диапазоне.

Начиная с C 2011, вы можете использовать _Static_assert для проверки констант перечисления:

enum { a, b, c, d, e };

_Static_assert(e <= 3, "Enumeration constant exceeds 3.");

До C 2011, вы можете проверять тесты различными способами, например:

enum { a, b, c, d, e };

int FailIfSizeMismatches[1];      // Define array with good size.
int FailIfSizeMismatches[e <= 3]; // Define with conflicting size if test fails.

(В C ++ замените _Static_assert на static_assert.)

0 голосов
/ 11 февраля 2020

Как написано в комментарии Frankie_ C, вы должны классифицировать предварительную обработку и обработку. enum оценивается после предварительной обработки, в то время как #define, #pragma, #warning оценивается при предварительной обработке

...