Почему эта программа компилируется с gcc, а не с g ++?

11

Следующая программа компилируется с 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 мы можем определить такую структуру? В С ++ я думаю, что это невозможно.
Теги:
gcc
g++

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. Итак, для этого типа в С++ это 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.

  • 0
    Спасибо, что сработало для g ++, но если в c нет такой вещи, как вложенная структура, то не должно ли это выдать ошибку?
  • 2
    @Sumit: Сумит: я не объяснил себе. В C вы можете определить структуру внутри другой структуры, но все имена структур будут видны в глобальном пространстве имен, так как это единственное доступное пространство имен. Однако переменная, определенная внутренней структурой, будет правильным членом структуры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню