clang-format 功能和错误检查在同一行
clang-format Function and error check in the same line
我努力设置 clang-format 以允许这种格式的短行,
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();
这个实现是必不可少的,所以它必须以最佳方式完成,我想知道是否可以用更简单、更有效的方式来完成。 欢迎批评指教
注:
作为表扬。有趣的是代码格式如何触发这种类型的发展。
我经常使用clang-format,我认为它不能实现这种格式化。
我在使用 OpenGL 和 DirectX 的库中经常遇到这种模式。你有一个 API 带有错误代码或错误堆栈,就像在 OpenGL 中一样,每个函数都可能失败或发出警告。您希望您的代码在发布时得到优化,并且仍然具有调试模式以在您发现错误时准确地找到出错的地方。
一些库提供了某种类型的错误回调,您可以设置它,每次出现相关错误时都会有效地调用它。
如果您想要更自定义的东西或没有提供错误回调,您可以编写一个简单的包装器来执行系统错误检查和警告日志记录。
使用这些解决方案,您甚至可以实现一些机制来在运行时激活调试。
现在,如果您正在编写以这种方式 return 错误 return 的库或函数,您可能希望使用调试回调策略将调试模式直接包含在库中。
现在,如果您想坚持使用宏解决方案,可以执行以下操作:
struct ErrorChecker
{
ErrorChecker& operator << (int ierr)
{
// Error checking code
return *this;
}
};
#define CHKERR ErrorChecker() <<
然后
CHKERR fun();
我努力设置 clang-format 以允许这种格式的短行,
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();
这个实现是必不可少的,所以它必须以最佳方式完成,我想知道是否可以用更简单、更有效的方式来完成。 欢迎批评指教
注:
作为表扬。有趣的是代码格式如何触发这种类型的发展。
我经常使用clang-format,我认为它不能实现这种格式化。
我在使用 OpenGL 和 DirectX 的库中经常遇到这种模式。你有一个 API 带有错误代码或错误堆栈,就像在 OpenGL 中一样,每个函数都可能失败或发出警告。您希望您的代码在发布时得到优化,并且仍然具有调试模式以在您发现错误时准确地找到出错的地方。
一些库提供了某种类型的错误回调,您可以设置它,每次出现相关错误时都会有效地调用它。
如果您想要更自定义的东西或没有提供错误回调,您可以编写一个简单的包装器来执行系统错误检查和警告日志记录。
使用这些解决方案,您甚至可以实现一些机制来在运行时激活调试。
现在,如果您正在编写以这种方式 return 错误 return 的库或函数,您可能希望使用调试回调策略将调试模式直接包含在库中。
现在,如果您想坚持使用宏解决方案,可以执行以下操作:
struct ErrorChecker
{
ErrorChecker& operator << (int ierr)
{
// Error checking code
return *this;
}
};
#define CHKERR ErrorChecker() <<
然后
CHKERR fun();