Следующая программа компилируется с 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
Как решить эту проблему?
Посмотрите на определение этой структуры в 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
.