В общем, генерация предупреждения кажется хорошим подходом (предупреждение вместо ошибки, поэтому вы можете записать несколько вещей за один прогон компиляции). Вот функция, которую я использовал, которая позволяет передавать значение и печатать его тип или передавать тип в качестве параметра шаблона:
template <typename T>
inline void debug_type(const T&) __attribute__((deprecated));
template <typename T>
inline void debug_type(const T&) { }
template <typename T>
inline void debug_type() __attribute__((deprecated));
template <typename T>
inline void debug_type() { }
Вы можете использовать это так:
debug_type(1); // Pass a value, let the compiler deduce its type
debug_type<char>(); // Pass a type explicitly
Это приводит к таким предупреждениям:
foo.cpp:73:17: warning: 'void debug_type(const T&) [with T = int]' is deprecated (declared at /tmp/arduino_build_static/sketch/Num.h:13) [-Wdeprecated-declarations]
debug_type(1);
^
foo.cpp:74:22: warning: 'void debug_type() [with T = char]' is deprecated (declared at /tmp/arduino_build_static/sketch/Num.h:19) [-Wdeprecated-declarations]
debug_type<char>();
Часть T = int
сообщения об ошибке показывает тип (который, конечно, может быть более сложным шаблонным типом, это только пример).
Особое преимущество этого предупреждения перед предупреждением о неиспользуемой переменной, предложенным в другом месте, состоит в том, что местом ошибки является место, где вызывается debug_type
, а не его реализация, поэтому фрагмент кода, показанный в ошибке, показывает выражение, тип которого напечатано (что может быть удобно, если вы хотите напечатать несколько разных одновременно).