您可以创建自定义异常并抛出它,以便:
- 调用未实现的函数将终止应用程序,而不是使其处于意外状态
- 即使没有实现所需的功能,仍然可以编译代码
- 您可以通过查看编译器警告(通过使用一些可能令人讨厌的技巧)或搜索您的项目目录轻松找到未实现的函数
- 您可以选择从发布版本中删除异常,如果有任何函数试图抛出异常,这将导致构建错误
#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
不关心你的构建配置,无论如何都会找到一切。你也可以去掉不推荐使用的限定符来清理你的编译器输出——上面的 hack 会产生很多不相关的噪音。根据您的优先级,这可能是一个劣势(例如,如果您当前正在实现特定于 Linux 的功能,则您可能不关心特定于 Windows 的功能,反之亦然。)
如果您使用 IDE,大多数都可以让您搜索整个项目,有些甚至可以让您右键单击一个符号并在任何使用它的地方查找。(但你说你不能使用一个,所以在你的情况下grep
是你的朋友。)