为什么这个程序用gcc编译但不用g ++编译?

时间:2014-01-10 08:54:10

标签: c++ c gcc g++

以下程序使用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

如何解决这个问题?

1 个答案:

答案 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_opsstruct 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