2013-01-23 74 views
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 
$ 
+0

'include/smb_ldap.h'文件是否有正確的包含保護? – wildplasser

回答

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 
0

作爲oleg_g暗示朝向你混合預處理器命令(#定義)和C++的typedef

的預處理器指令( #define等)在解析器處理結果代碼之前被處理。當你的typedef ber_tag_t預處理命令永遠不會知道這個,而是你需要一個#定義變量來表示類型定義:

#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 

爲了澄清;預處理器指令只能看到其他預處理器變量,因爲此時尚未解釋代碼。

編輯: 我還應該提到,如果可能的話,以避免需要的方式佈置代碼可能是有益的。例如,使用一個單獨的公共標題,其中包含和類型受到例如包含警衛的保護。

相關問題