這實際上是一個相當有趣的錯誤;錯誤消息並沒有太多的告訴你問題是什麼。
宏定義:
#ifndef uint32_t
#define unsigned int uint32_t;
#endif
有不正當的幾個層次。在宏定義,被定義的宏變爲第一,其次,它展開爲序列 - 其通常應該不被由分號結束:
#define uint32_t unsigned int
使用宏用於此目的的是一種,但餿主意;一個typedef
要好得多:
typedef unsigned int uint32_t;
(注意,被定義的標識進入最後的,並且需要一個分號;宏定義和typedef
■找非常不同的語法)。不像宏,沒有辦法測試typedef
是否已經被定義。
的uint32_t
應該已經在<stdint.h>
或<cstdint>
定義 - 但是這是由1999 ISO C標準添加到C一個標準的頭,並用C採用++僅由2011 ISO C++標準,所以有一個像樣的機會它將不可用,具體取決於您使用的C++實現。如果頭存在,你可以使用#ifdef UINT_MAX
以確定是否uint32_t
定義,但如果你擔心不具有一個32位無符號類型的所有系統,這只是有用的。
但你的代碼甚至不指uint32_t
- 爲啥宏定義會導致問題?
因爲你得到的順序不對,你的宏定義沒有定義uint32_t
,它定義unsigned
,使這個詞出現的任何將擴大到int uint32_t;
(包括分號)。
但你不指unsigned
或者 - 至少沒有直接。這個問題,那麼,在你的_tmain
定義:
int _tmain(int argc, _TCHAR* argv[])
兩個_tmain
作爲程序的入口點和類型名稱_TCHAR
是微軟特有的。我沒有進入目前微軟的編譯器,但你看到的錯誤消息,_TCHAR
(邏輯上應該被一個typedef)可能是一個可擴展爲類似unsigned short
宏(使用16判斷因爲Windows喜歡使用UTF-16的16位寬字符)。
所以,你的定義:
int _tmain(int argc, _TCHAR* argv[])
擴展爲:
int _tmain(int argc, unsigned short* argv[])
它,因爲你無意中重新定義unsigned
,則擴展爲:
int _tmain(int argc, int uint32_t; short* argv[])
而且,由於參數聲明用逗號分隔,而不是用分號分隔,這是一個語法錯誤。我不知道爲什麼這會導致您所看到的特定錯誤信息,但這並不令人吃驚。語法錯誤,尤其是涉及錯誤定義的宏的錯誤,通常會導致錯誤消息的混淆。
這樣的事情最好的策略是通常看最早行,編譯器會報告錯誤。如果錯誤信息本身沒有照亮,請忽略它並研究源,試圖弄清楚你可能弄錯了什麼。
如果失敗(因爲它會在這種情況下),試圖通過只預處理器運行程序。大多數基於Unix的編譯器(包括gcc)都使用-E
選項;我不知道微軟的相應選項。預處理器的輸出可能是非常冗長(這將包括直接或間接所有你包括報頭的錯位副本),但研究它可能會導致你一些有用的東西。
在這種特殊情況下,註釋掉您的#define
指令會導致錯誤消失,這將暗示#define
存在問題,即使它與錯誤消息之間的關係遠不明顯。
UPDATE:
我的猜測是不正確大部分。 _TCHAR
不是宏;顯然這是一個typedef。錯誤是沒有的_tmain
的定義,它是在成員聲明:
uint32_t emp_id;
而且由於uint32_t
還沒有明確規定它根本沒有。
錯誤消息仍然是誤導。由於uint32_t
尚未聲明,因此它被視爲普通標識符而不是類型名稱 - 類型名稱被視爲語法不同於普通標識符。編譯器試圖通過猜測uint32_t
可能是一個成員的名字,這意味着它應該有一個分號從錯誤中恢復 - 但隨後的聲明
uint32_t;
將宣佈一員,沒有明確的類型。在C的舊版本中,這將是合法的並且會使該成員成爲int
。編譯器對代碼實際意義的猜測是錯誤的。順便說一句,如果你顯示一條錯誤信息,請告訴我們它適用於哪條線。
'_TCHAR'必須是一個宏,可能擴展爲'unsigned char'或'unsigned short'。 –
我認爲這是一個比它最初看起來更好的問題。問題是'#define',但是它和錯誤信息之間的關係遠不明顯;詳情請參閱我的答案。 –