0

ソース コードのコンパイル中に次のエラーが発生します。

Compiling lib/netapi/joindomain.c
cc: "include/smb_ldap.h", line 33: error 1584: Inconsistent type declaration: "ber_tag_t".
cc: "include/smb_ldap.h", line 34: error 1713: Illegal redeclaration for identifier "ber_int_t".
The following command failed:
)
*** Error exit code 1

エラーにフラグを立てる対応するコードは次のとおりです。

if HAVE_LBER_H
#include <lber.h>
#if defined(HPUX) && !defined(_LBER_TYPES_H)
#ifndef ber_tag_t
typedef unsigned long ber_tag_t;
typedef int ber_int_t;
#endif
#endif 

このエラーの根本原因を理解するために助けを求めます。

前もって感謝します。

参考までに、私のマシンとコンパイラの詳細は次のとおりです。

$  uname -a
HP-UX cifsvade B.11.31 U 9000/800 3751280844 unlimited-user license
$  which cc
/usr/bin/cc
$  ls -lrt /usr/bin/cc
lrwxr-xr-x   1 root       sys             17 Oct  8 17:45 /usr/bin/cc -> /opt/ansic/bin/cc
$ 
4

2 に答える 2

1

lber.h は、ber_tag_t と ber_tag_t を次のように定義します。

    typedef impl_tag_t ber_tag_t;
    typedef impl_int_t ber_int_t;

コードでそれらを再定義しようとすると、これが当てはまります。一つの条件

    #ifndef ber_tag_t

次のような場所で ber_tag_t を定義しない限り、常に真です。

    #define ber_tag_t smth
于 2013-01-23T13:36:25.033 に答える
0

oleg_gがヒントとして、プリプロセッサコマンド(#define)とc++typedefを混在させています

プリプロセッサディレクティブ(#defineなど)は、パーサーが結果のコードを処理する前に処理されます。typedef ber_tag_tを実行すると、プリプロセッサコマンドはこれを認識しません。代わりに、変数を#defineして、タイプが定義されていることを示す必要があります。

#if HAVE_LBER_H
#include <lber.h>
#if defined(HPUX) && !defined(_LBER_TYPES_H)
#ifndef DEFINED_BER_TAG_T
#define DEFINED_BER_TAG_T
typedef unsigned long ber_tag_t;
typedef int ber_int_t;
#endif
#endif 

明確にするために; この時点ではコードがまだ解釈されていないため、プリプロセッサディレクティブは他のプリプロセッサ変数のみを参照します。

編集:可能であれば、これが必要にならないようにコードをレイアウトすることも有益かもしれないことにも言及する必要があります。たとえば、インクルードとタイプがインクルードガードによって保護されている別の共通ヘッダーを使用します。

于 2013-01-23T14:28:00.040 に答える