2012-01-11 118 views
6

我正在編譯用於Windows 7 x64 SUA/Interix的64位GCC編譯器grepstddef.h:錯誤:重複'unsigned'

它扼流圈在stddef.h標線:

#ifndef _SIZE_T_DEFINED 
#if defined (lp64) || defined(_WIN64) 
#ifdef lp64 
typedef unsigned long size_t;     // <------ error 
#else /* lp64 */ 
typedef unsigned __int64  size_t; 
#endif /* lp64 */ 
#else /* (defined(lp64) || defined(_WIN64)) */ 
typedef unsigned int size_t; 
#endif /* (defined(lp64) || defined(_WIN64)) */ 
#define _SIZE_T_DEFINED 
#define _SIZE_T 
#endif /* _SIZE_T_DEFINED */ 

make的輸出是:

make all-recursive 
Making all in intl 
gcc -c -DLOCALEDIR=\"/usr/local/share/locale\" -DLOCALE_ALIAS_PATH=\"/usr/local/share/locale\" -DLIBDIR=\"/usr/local/lib\" -DIN_LIBINTL -DHAVE_CONFIG_H -I.. -I. -I../../intl -D_ALL_SOURCE -D_REENTRANT -I/usr/local/include -I/usr/local/include -D_ALL_SOURCE -D_REENTRANT ../../intl/intl-compat.c 

In file included from ../../intl/gettextP.h:23:0, 
       from ../../intl/intl-compat.c:25: 
/usr/include/stddef.h:50:23: error: duplicate 'unsigned' 
*** Error code 1 

Stop in /tmp/grep-2.5.4-src/build/intl. 
*** Error code 1 

Stop in /tmp/grep-2.5.4-src/build (line 329 of Makefile). 
*** Error code 1 

Stop in /tmp/grep-2.5.4-src/build (line 244 of Makefile). 

我不明白其中的原因......它已經混淆這long正在使用,就好像它在GCC中是64位一樣,但錯誤更令人困惑!想法?

+1

看起來好像long已經被#defined unsigned包含在前面的某個地方。 – 2012-01-11 21:51:00

+0

有沒有可能'size_t'被預先定義爲一個宏,比如'#define size_t unsigned int'或其他,但是'_SIZE_T_DEFINED'沒有被定義?然後,有問題的行將等同於'typedef unsigned long unsigned int;'(或類似的),這將觸發該錯誤消息。 – ruakh 2012-01-11 21:51:48

+0

你們絕對是對的:)感謝指針,這真是令人費解。 – Mehrdad 2012-01-11 21:53:59

回答

10

某處在你的代碼,有人爲可能沒有:

#define size_t unsigned long 

或者類似的規定,不具有確定的_SIZE_T_DEFINED時,他們做到了。然後通過錯誤消息中列出的路徑代碼#include s stddef.h。這使得你的錯誤行如下所示:

typedef unsigned long unsigned long; 

給編譯器,這是不會工作的!

+1

:確實,我剛剛用'grep'(如何meta ......)搜索並看到:'./config.h:#define size_t unsigned int' ...謝謝! – Mehrdad 2012-01-11 21:53:38

+0

autoconf必須假定一個非常過時的編譯器/實現爲它定義'size_t'作爲宏... – dreamlax 2012-01-11 21:55:46

+0

@Mehrdad,沒問題。樂於幫助! – 2012-01-11 21:58:06