2013-12-14 422 views
-2

我得到這些錯誤錯誤錯誤C4430:缺少類型說明符 - 假定爲int。注意:C++不支持默認int

錯誤2錯誤C4430:缺少類型說明符 - 假定爲int。注意:C++不支持default-int 錯誤2錯誤C4430:缺少類型說明符 - 假定爲int。注意:C++不支持默認int

我的代碼是

#include "stdafx.h" 
#include "iostream" 

#ifndef uint32_t 
#define unsigned int uint32_t; 
#endif 

struct employee 
{ 
    char  emp_name[20]; 
    uint32_t emp_id; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    return 0; 
} 

怎麼做這個。

謝謝, 拉溫德拉古普塔

+0

'_TCHAR'必須是一個宏,可能擴展爲'unsigned char'或'unsigned short'。 –

+0

我認爲這是一個比它最初看起來更好的問題。問題是'#define',但是它和錯誤信息之間的關係遠不明顯;詳情請參閱我的答案。 –

回答

1

首先,uint32_t通常是typedef,而不是一個宏。所以,即使你有一個範圍的定義,你的#ifdef會做錯誤的事情。

其次,如果你沒有要打一個名爲uint32_t(我不建議)宏,正確的順序是:

#define uint32_t unsigned int 

但是,你是更好包括<cstdint>(如果有)或<stdint.h>以獲得uint32_t的正確定義。 (我相信<cstdint>是C++ 11)

2
#define unsigned int uint32_t; 

這將導致unsigned成爲int uint32_t;一個宏,它不可能是你想要的。

2

這實際上是一個相當有趣的錯誤;錯誤消息並沒有太多的告訴你問題是什麼。

宏定義:

#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。編譯器對代碼實際意義的猜測是錯誤的。順便說一句,如果你顯示一條錯誤信息,告訴我們它適用於哪條線。

相關問題