用于调试/忽略功能的自定义编译时间说明符

问题描述 投票:0回答:1

实现以下调试功能的好方法是什么?我想定义一个易于使用的function specifier类似于内联,它基于启用的预处理器标志告诉编译器何时完全忽略一个函数。理想情况下,我想声明如下函数:

DEBUG_FUNCTION_VERBOSE void saveMesh(const std::string &fileName, const Mesh &mesh, ...);
DEBUG_FUNCTION_INFO void logInfo(const std::string &message);
DEBUG_FUNCTION_CHECK void checkVertexAttributes(const Mesh &mesh);
DEBUG_FUNCTION_ERROR void logError(const std::string &messageOfDoom);

存在排序,从不那么重要且缓慢到临界而更快。我的想法是设置一个预处理器标志,该标志确定启用了哪些特殊调试功能。例如,可能有一个标志,如DEBUG_LEVEL_CHECK,它启用后两种调试功能,或另一个标志DEBUG_LEVEL_VERBOSE,使所有调试功能都启用。如果禁用了调试功能类型,则本质上我希望编译器忽略对该功能的所有调用,包括对其参数的求值(例如在发布模式下声明)。

这些功能的动机是加速调试。我想在我的代码中调用此类调试函数,并将其保留在那里。 用于控制输出并检查的内容,我宁愿使用preprocessor flag,而不是手动插入和删除对此类函数的调用。

我看过这篇文章:What exactly happens to empty inline functions?但这看起来将导致我的情况下的冗余代码,而且我不确定如何将其应用于共享相同名称的重载函数。

c++ debugging preprocessor compile-time
1个回答
0
投票

类似:

inline void saveMesh(...) {
    #ifdef DEBUG
    ...
    #else
    return;
 }

如果未定义DEBUG,则对该函数的任何调用都不会做任何事情,并且编译器可能会对其进行完全优化。这是您要找的东西吗?

© www.soinside.com 2019 - 2024. All rights reserved.