我正在尝试编写一个包装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
编译时(在本例中使用MPI编译器包装器使用下面的pgc):
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
的类似错误
任何想法我做错了什么?
答案 0 :(得分:5)
您定义了一个struct ReqStruct
,而不是ReqStruct
,这些不是一回事。
将功能更改为
struct ReqStruct RecvAsynch(float *recvbuf, FILE *fp);
或使用typedef:
typedef struct ReqStruct ReqStruct;
答案 1 :(得分:4)
在C ++中,序列为:
struct ReqStruct
{
MPI_Request req;
};
定义了一个可以在函数声明中使用的类型ReqStruct
。
在C中,它没有(它定义了你可以使用的类型struct ReqStruct
);您需要添加typedef
,例如:
typedef struct ReqStruct
{
MPI_Request req;
} ReqStruct;
是的,struct
标记可以与typedef
名称相同。或者您可以使用struct ReqStruct
代替ReqStruct
到处;我会优先使用typedef
。