2017-03-09 88 views
0

我從GNU Make中收到奇怪的「預期聲明」錯誤。Gnu在打開頭文件時拋出錯誤

inc/pub/teos_config.h:22:28: error: expected declaration specifiers or '...' before '(' token 
#define TEOS_SYSUINT  ((unsigned)TEOS_SYSINT) 
          ^

這是文件...

#ifndef __TEOS_CONFIG_H__ 
#define __TEOS_CONFIG_H__ 

#include <stdint.h> 

#ifdef __cplusplus 
extern "C" { 
#endif 

#define TEOS_SYSINT  int32_t 
#define TEOS_SYSUINT  ((unsigned)TEOS_SYSINT) 

#ifdef __cplusplus 
} 
#endif 

#endif // __TEOS_CONFIG_H__ 

非常簡單。我是GNU Make的新手,所以也許我錯過了一個開關?

+2

也許一個錯誤在什麼包括'teos_config.h'而不是一個文件? 另外,與你的問題無關,但是你有什麼理由不使用typedefs而不是define? – rtur

+3

gnu-make沒有問題 - 這是一個C頭文件,錯誤來自你的編譯器。但嘗試用'typedef'替換這些宏呢? –

回答

1

頭是有效的,它應該編譯(我已經嘗試了GCC)。所以這意味着錯誤來自另一個文件,其中包括teos_config.h

這不是一個嚴格意義上的gnu-make錯誤。

但你通常應該使用typedef,而不是define爲你做

typedef int32_t TEOS_SYSINT; 
+0

它仍然會編譯,如果你嘗試'int main(void){TEOS_SYSUINT myUint = 33;返回0; ''? – yano

2

錯誤由C編譯器發出,而不是由make本身發出。它反映了源代碼中的錯誤。

此外,錯誤不是直接顯示在頭文件中,而是在使用該頭中定義的TEOS_SYSUINT宏的C源文件中。您已刪除說明實際錯誤位置的整體多行錯誤消息的一部分。儘管如此,我可以用相當高的置信度說當你試圖在變量或函數定義中使用該宏作爲類型說明符時會出現問題。例如,

TEOS_SYSUINT x; 

...它展開......

((unsigned)int32_t) x; 

...這是不變量x的有效申報。

目前還不清楚爲什麼你不定義宏這樣,而是:

#define TEOS_SYSUINT  uint32_t 

更改爲將很可能解決你問這個問題。