2014-01-10 28 views
11

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

如何解決這個問題?

+2

結構的定義在哪裏?在C中,我們可以定義一個這樣的結構嗎?在C++中,我認爲這是不可能的。 – kernel

回答

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

+0

感謝g ++的工作,但如果在c中沒有嵌套結構這樣的事情,那麼它不應該拋出一些錯誤? – Sumit

+2

@Sumit:我沒有解釋自己。在C中,你可以在另一個結構體中定義一個結構體,但是所有的結構體名都將在全局命名空間中可見,因爲這是唯一的命名空間。但是,用內部結構定義的變量將是結構的正確成員。 – rodrigo

相關問題