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

12

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

如何解决这个问题?


2
结构体的定义在哪里???在C语言中,我们可以像这样定义一个结构体吗?在C++中,我认为这是不可能的。 - kernel
1个回答

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


谢谢,这对g++可行,但是如果在c中没有嵌套结构体的话,它不应该会抛出一些错误吗? - Sumit
2
@Sumit:我没有解释清楚。在C语言中,您可以在另一个结构体内定义一个结构体,但所有结构体名称都将在全局命名空间中可见,因为那是唯一的命名空间。然而,使用内部结构定义的变量将成为该结构的正确成员。 - rodrigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接