我正在尝试编写一个包装 MPI 的框架库。
我有一个框架调用的头文件
afw.h
和一个名为 afw.c
的框架实现文件。
我希望能够通过在应用程序代码中执行
#include "afw.h"
来编写使用该框架的应用程序代码。
摘自
afw.h
:
#ifndef AFW_H
#define AFW_H
#include <mpi.h>
struct ReqStruct
{
MPI_Request req;
};
ReqStruct RecvAsynch(float *recvbuf, FILE *fp);
int RecvTest(ReqStruct areq);
我在
RecvAsynch
中提供了 afw.c
的实现,其中 #includes afw.h
当我使用
mpicc
进行编译时(本例中使用下面的 pgc 为 MPI 编译器包装器):
mpicc -c afw.c -o afw.o
我得到:
PGC-S-0040-Illegal use of symbol, ReqStruct (./afw.h: 69)
PGC-W-0156-Type not specified, 'int' assumed (./afw.h: 69)
PGC-S-0040-Illegal use of symbol, ReqStruct (./afw.h: 71)
PGC-W-0156-Type not specified, 'int' assumed (./afw.h: 71)
以及在
ReqStruct
中使用
afw.c
时出现类似错误
你知道我做错了什么吗?
您定义了
struct ReqStruct
,而不是 ReqStruct
,它们不是同一件事。
将功能更改为
struct ReqStruct RecvAsynch(float *recvbuf, FILE *fp);
或使用 typedef:
typedef struct ReqStruct ReqStruct;
在 C++ 中,顺序:
struct ReqStruct
{
MPI_Request req;
};
定义了一个类型
ReqStruct
,您可以在函数声明中使用它。
在 C 中则不然(它定义了一个可以使用的类型
struct ReqStruct
);您需要添加一个typedef
,例如:
typedef struct ReqStruct
{
MPI_Request req;
} ReqStruct;
是的,
struct
标签可以与typedef
名称相同。 或者您可以在任何地方使用 struct ReqStruct
代替 ReqStruct
;我会优先使用 typedef
。