Почему эта программа компилируется с помощью 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

Посмотрите на определение этой структуры в 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. Итак, для этого типа в С++ это 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.