1

我正在尝试编写一个包装 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

任何想法我做错了什么?

4

2 回答 2

5

您定义了 a struct ReqStruct, not ReqStruct,它们不是一回事。

要么将功能更改为

struct ReqStruct RecvAsynch(float *recvbuf, FILE *fp);

或使用 typedef:

typedef struct ReqStruct ReqStruct;
于 2012-04-04T14:34:19.273 回答
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优先使用。

于 2012-04-04T14:35:35.777 回答