Программно генерировать исключения или предупреждения во время компиляции

Задний план:

Я делаю библиотеки для своего Arduino и компилирую с помощью Arduino IDE. Я хотел бы поместить в библиотеку код, который будет генерировать предупреждение или ошибку во время компиляции, если в конструкторе класса используются определенные значения.

Пример

  • У меня есть класс Classes в библиотеке school.h

  • Классы имеют конструктор Classes::Classes(byte Time_Slot, int SubjectId);

  • Time_Slot обычно 1–10

  • Time_Slot всегда меньше 51

  • Time_Slot никогда 0

Могу ли я добавить что-нибудь в свой файл school.h или school.cpp, чтобы, если в моем файле Classroom Sketch.ino.

#include <school.h>

Classes Math(2,0);
Classes English(30,1);
Classes History(0,2);
Classes Science(55,3);

void setup() {...}
void loop(){...}

Выдаст ошибки/предупреждения при компиляции, подобные:

  • Classes English not within normal bounds Classes Time_slot typically between 1 and 10 inclusive
  • Classes History invalid, Time_slot must be between 1 and 50
  • Classes Science invalid, Time_slot must be between 1 and 50

person GentlemanS    schedule 20.08.2018    source источник
comment
Вы можете делать серьезные ошибки, используя static_assert, и вы можете делать предупреждения, используя различные приемы, но только если аргументы исправлены во время компиляции, то есть они являются аргументами шаблона, а не аргументами функции.   -  person SergeyA    schedule 20.08.2018
comment
Я не готов предложить это, но, поскольку у вас ограниченное количество значений, возможно, вам следует использовать enum class, чтобы вы могли передать ему только правильное значение   -  person NathanOliver    schedule 20.08.2018
comment
статическое утверждение ?   -  person Victor Gubin    schedule 20.08.2018
comment
если бы этого не было во время компиляции, я бы предложил использовать соответствующий тип вместо byte, который может содержать только значения от 1 до 50.   -  person 463035818_is_not_a_number    schedule 20.08.2018
comment
Я считаю, что static assert будет работать для меня, но мне было бы интересно, какие приемы я мог бы использовать для создания предупреждения.   -  person GentlemanS    schedule 20.08.2018
comment
@GentlemanS Попробуйте один из них.   -  person François Andrieux    schedule 20.08.2018