Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构中的PETSc C宏_C_Macros_Header Files_Petsc - Fatal编程技术网

结构中的PETSc C宏

结构中的PETSc C宏,c,macros,header-files,petsc,C,Macros,Header Files,Petsc,在PETSc中,许多常用结构(如Vec、Mat、IS等)的定义与下面的4个代码片段类似。 问题: PETSCHEADER何时以及如何扩展?我正在用另一种语言编写外部接口,我想知道是否需要将宏包装成函数之类的东西 hdr和ops的范围是什么 提前谢谢 petscvec.h typedef struct _p_Vec* Vec; 向量impl.h struct _p_Vec { PETSCHEADER(struct _VecOps); PetscLayout m

在PETSc中,许多常用结构(如Vec、Mat、IS等)的定义与下面的4个代码片段类似。 问题:

  • PETSCHEADER何时以及如何扩展?我正在用另一种语言编写外部接口,我想知道是否需要将宏包装成函数之类的东西
  • hdr
    ops
    的范围是什么
提前谢谢


petscvec.h

typedef struct _p_Vec* Vec;
向量impl.h

struct _p_Vec {
  PETSCHEADER(struct _VecOps);
  PetscLayout            map;
  void                   *data;     /* implementation-specific data */
  ...
typedef struct _VecOps *VecOps;
struct _VecOps {
  PetscErrorCode (*duplicate)(Vec,Vec*);         /* get single vector */
  PetscErrorCode (*duplicatevecs)(Vec,PetscInt,Vec**);     /* get array of vectors */    
...
petscimpl.h

#define PETSCHEADER(ObjectOps) \
  _p_PetscObject hdr;          \
  ObjectOps      *ops
向量impl.h

struct _p_Vec {
  PETSCHEADER(struct _VecOps);
  PetscLayout            map;
  void                   *data;     /* implementation-specific data */
  ...
typedef struct _VecOps *VecOps;
struct _VecOps {
  PetscErrorCode (*duplicate)(Vec,Vec*);         /* get single vector */
  PetscErrorCode (*duplicatevecs)(Vec,PetscInt,Vec**);     /* get array of vectors */    
...

关于第一点,可能会有所帮助,尤其是第4阶段。我还建议您通过预处理器运行代码,并在编译器“正确”获得它之前查看预处理代码的外观。我已经构建了这个库,也许我可以在某个地方找到预处理的源代码,或者通常在make之后将其删除?否则,是否有一组cpp标志用于发出此信号?通常没有单独的预处理器步骤,但您可以直接调用预处理器(POSIX(如Linux或OSX)环境中的
cpp
),或使用例如
gcc-e
(带有正常标志)在预处理源代码后要求gcc编译器停止。在VisualStudio中也应该有生成预处理代码的选项,可能在其他IDE中也有。