在 PETSc 中,许多常用结构(例如 Vec、Mat、IS 等)的定义类似,如下面的 4 个片段所示。问题:
- PETSCHEADER 何时以及如何扩展?我正在用另一种语言编写外来界面,并且想知道是否必须将宏包装在函数中或诸如此类
hdr
和的范围是ops
什么?
提前致谢
petscvec.h
typedef struct _p_Vec* Vec;
vecimpl.h
struct _p_Vec {
PETSCHEADER(struct _VecOps);
PetscLayout map;
void *data; /* implementation-specific data */
...
petscimpl.h
#define PETSCHEADER(ObjectOps) \
_p_PetscObject hdr; \
ObjectOps *ops
vecimpl.h
typedef struct _VecOps *VecOps;
struct _VecOps {
PetscErrorCode (*duplicate)(Vec,Vec*); /* get single vector */
PetscErrorCode (*duplicatevecs)(Vec,PetscInt,Vec**); /* get array of vectors */
...