clang-format功能和错误检查在同一行

时间:2017-11-01 23:02:13

标签: c++ error-handling clang-format

我很难设置clang格式以允许这种格式的短行,

ierr = fun(); CHKERRQ(ierr);

clang-format打破这一行,结果

 ierr = fun(); 
 CHKERRQ(ierr);

这是一个阻止clang-fromat打破短线的解决方案吗?或者这原则上错误的想法是格式化这样的代码。任何建议都非常感激。

编辑:关注纪尧姆回答

事实上,我有一个稍微复杂的问题,两个库,特别是PETSc和MoAB返回不同类型的错误代码。此外,该系统有自己的错误代码,需要处理。所有这些都没有影响效率。

struct ErrorCheckerCode {
  inline void operator<<(const MoFEMErrorCode err) {
    if (PetscUnlikely(err)) {
      // Handle & thorw PETSc/MoFEM error
    }
    return;
  }
  inline void
  operator<<(const moab::ErrorCode err) {
    if (PetscLikely(MB_SUCCESS != err)) {
      // Handle & trow MOAB error 
    }
    return;
  }
  static const char *fUNC;
  static const char *fILE;
  static int lINE;
};

struct ErrorCheckerFunction {
  inline ErrorCheckerCode operator<<(const char *func) {
    ErrorCheckerCode::fUNC = func;
    return ErrorCheckerCode();
  }
 };

struct ErrorCheckerFile {
  inline ErrorCheckerFunction operator<<(const char *file) {
    ErrorCheckerCode::fILE = file;
    return ErrorCheckerFunction();
  }
};

struct ErrorCheckerLine {
  inline ErrorCheckerFile operator<<(int line) {
    ErrorCheckerCode::lINE = line;
    return ErrorCheckerFile();
  }
};

定义如下:

#define CHKERR                                                                 \
  ErrorCheckerLine() << __LINE__ << __FILE__ << PETSC_FUNCTION_NAME <<

所以最后我可以处理这样的错误

CHKERR fun_moab();
CHKERR fun_petsc();
CHKERR fun_mofem();

这个实现是必不可少的,所以必须以最佳方式完成,我想知道是否可以更简单,更有效的方式完成。 非常欢迎批评或建议。

注意:

作为一个赞扬。有趣的是,代码的格式化会触发这种类型的开发。

1 个答案:

答案 0 :(得分:1)

我经常使用clang-format,但我认为它不能实现这种格式化。

我在使用OpenGL和DirectX的库中遇到过很多这种模式。您有一个带有错误代码的API或类似OpenGL的错误堆栈,并且每个函数都可能失败或发出警告。您希望您的代码在发布时进行优化,并且仍然具有调试模式,以便在发现错误时发现错误。

某些库提供了一些可以设置的错误回调,并且每次发生相关错误时都会被有效地调用。

如果您想要更自定义的内容或者没有提供错误回调,您可以编写一个简单的包装器来执行系统错误检查和警告记录。

使用这些解决方案,您甚至可以实现某种机制来在运行时激活调试。

现在,如果您正在编写以这种方式返回返回错误的库或函数,您可能希望使用调试回调策略将调试模式直接包含在库中。

现在,如果您想坚持使用宏解决方案,可以执行以下操作:

struct ErrorChecker
{
    ErrorChecker& operator << (int ierr)
    {
        // Error checking code
        return *this;
    }
};

#define CHKERR ErrorChecker() <<

然后

CHKERR fun();