标头编译错误中的结构

问题描述 投票:0回答:2

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

时出现类似错误

你知道我做错了什么吗?

c mpi header-files
2个回答
5
投票

您定义了

struct ReqStruct
,而不是
ReqStruct
,它们不是同一件事。

将功能更改为

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

或使用 typedef:

typedef struct ReqStruct ReqStruct;

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

© www.soinside.com 2019 - 2024. All rights reserved.