以下程序使用gcc编译但不使用g ++编译,我只生成目标文件。
这是prog.c:
#include "prog.h"
static struct clnt_ops tcp_nb_ops = {4};
这是prog.h:
#ifndef _PROG_
#define _PROG_
#include <rpc/rpc.h>
#endif
当我这样做时:
gcc -c prog.c
生成目标代码,但是,
g++ -c prog.c
给出错误:
variable ‘clnt_ops tcp_nb_ops’ has initializer but incomplete type
如何解决这个问题?
答案 0 :(得分:19)
在clnt.h
中查看此结构的定义:
typedef struct CLIENT CLIENT;
struct CLIENT {
AUTH *cl_auth; /* authenticator */
struct clnt_ops {
enum clnt_stat (*cl_call) (CLIENT *, u_long, xdrproc_t, caddr_t, xdrproc_t, caddr_t, struct timeval);
/* ...*/
} *cl_ops;
/* ...*/
};
如您所见,struct clnt_ops
在 struct CLIENT
内定义了。因此,C ++中此类型的正确名称是CLIENT::clnt_ops
。但是在C中,没有嵌套结构这样的东西,因此它只是struct clnt_ops
可见。
如果您想要便于携带,可以添加以下内容:
#ifdef __cplusplus
typedef CLIENT::clnt_ops clnt_ops;
#else
typedef struct clnt_ops clnt_ops;
#endif
clnt_ops tcp_nb_ops = ...;
但我认为这种类型根本不是由客户端代码直接使用。而是仅使用整个struct CLIENT
。