Вы можете создать собственное исключение и выдать его так, чтобы:
- Вызов нереализованной функции завершит приложение, а не оставит его в неожиданном состоянии.
- Код все еще может быть скомпилирован, даже без реализации необходимых функций.
- Вы можете легко найти нереализованные функции, просмотрев предупреждения компилятора (используя некоторые, возможно, неприятные приемы) или выполнив поиск в каталоге вашего проекта.
- При желании вы можете удалить исключение из выпускных сборок, что приведет к ошибкам сборки, если есть какие-либо функции, которые пытаются генерировать исключение.
#if defined(DEBUG)
#if defined(__GNUC__)
#define DEPRECATED(f, m) f __attribute__((deprecated(m)))
#elif defined(_MSC_VER)
#define DEPRECATED(f, m) __declspec(deprecated(m)) f
#else
#define DEPRECATED(f, m) f
#endif
class not_implemented : public std::logic_error {
public:
DEPRECATED(not_implemented(), "\nUnimplemented function") : logic_error("Not implemented.") { }
}
#endif // DEBUG
Нереализованные функции будут выглядеть так:
void doComplexTask() {
throw not_implemented();
}
Вы можете искать эти нереализованные функции несколькими способами. В GCC вывод для отладочных сборок:
main.cpp: In function ‘void doComplexTask()’:
main.cpp:21:27: warning: ‘not_implemented::not_implemented()’ is deprecated:
Unimplemented function [-Wdeprecated-declarations]
throw not_implemented();
^
main.cpp:15:16: note: declared here
DEPRECATED(not_implemented(), "\nUnimplemented function") : logic_error("Not implemented.") { }
^~~~~~~~~~~~~~~
main.cpp:6:26: note: in definition of macro ‘DEPRECATED’
#define DEPRECATED(f, m) f __attribute__((deprecated(m)))
Релизные сборки:
main.cpp: In function ‘void doComplexTask()’:
main.cpp:21:11: error: ‘not_implemented’ was not declared in this scope
throw not_implemented;
^~~~~~~~~~~~~~~
Вы можете искать исключение с помощью grep
:
$ grep -Enr "\bthrow\s+not_implemented\b"
main.cpp:21: throw not_implemented();
Преимущество использования grep
заключается в том, что grep
не заботится о вашей конфигурации сборки и все равно найдет все. Вы также можете избавиться от устаревшего квалификатора, чтобы очистить вывод вашего компилятора — вышеописанный хак генерирует много ненужного шума. В зависимости от ваших приоритетов это может быть недостатком (например, вы можете не заботиться о функциях, специфичных для Windows, если в настоящее время реализуете функции, специфичные для Linux, или наоборот).
Если вы используете IDE, большинство из них позволит вам выполнять поиск по всему проекту, а некоторые даже позволяют щелкнуть правой кнопкой мыши символ и найти его везде, где он используется. (Но вы сказали, что не можете его использовать, поэтому в вашем случае grep
— ваш друг.)
person
ShadowFan-X
schedule
05.06.2018
<methodname>
в файле .h, а затем искать<myclass>::<methodname>
в файле cpp? Мои навыки регулярных выражений, к сожалению, бесполезны: P - person Default   schedule 14.01.2013