我讀過的主題,文章和SO答案的#define
值沒有類型,我已經決定了這個概念,認爲類型是容器變量的屬性,而不是值的屬性本身:斷言值文字沒有類型是錯誤的?
const char cVALUE = 100; // 'cVALUE' is char with value 100, wich type is '100'?
const short sVALUE = 100; // 'sVALUE' is short with value 100, wich type is '100'?
const int iVALUE = 100; // 'iVALUE' is int with value 100, wich type is '100'?
#define VALUE 100 // wich type is 'VALUE'?
但是,怎麼樣value suffixes?
#define VALUE_L 100l // 'VALUE_L' is long?
#define VALUE_UL 100ul // 'VALUE_UL' is unsigned long?
#define VALUE_LL 100ll // 'VALUE_LL' is long long?
#define VALUE_ULL 100ull // 'VALUE_ULL' is unsigned long long?
在上面的代碼中,類型似乎附着的價值,所以這一切的原始值類型的值,而不是什麼我以前讀。但還有更多!文本文字甚至有限定詞,例如:
#define TEXT "Text" // '"Text"' is an array of some kind of chars.
在#define
文本值以上的類型是(字符類型,如果你使用MSVC工作,我認爲字符類型可以改變改變project settings -> Character set,沒有想法,如果它可能在另一個IDE)它也有const
cualifier,它是一個LValue而不是一個RValue,數字和文字文字之間的所有這些行爲差異擾亂了我。
因此,假設字符類型是char
,字面"Text"
的類型是const char *
,const char * const
或const char[5]
?或者至少,在上下文中推導出正確類型之前,它根本沒有類型?
而且,在C++ 11標準,該文本文字也可以使用一些prefixes,設置字符集的類型爲:
#define TEXT L"Text" // wide string with char type wchar_t
#define TEXTu8 u8"Text" // UTF-8 string with char type char
#define TEXTu u"Text" // UTF-16 string with char type char16_t
#define TEXTU U"Text" // UTF-32 string with char type char32_t
想着這一切的東西后,我很迷茫,於是我懇求一些建議:
- 爲什麼常識是文字值(和
#define
s)沒有類型,但可以用文字指定類型?換句話說:斷言值文字沒有類型是錯誤的? - 值文字沒有後綴和沒有小數(如
100
),總是可以考慮類型int? - 哪些是文字文字的類型和限定符,甚至考慮它的前綴?
問題在於你的前提。你用#值來定義'#define',但它們不是這樣的。它們是宏。 'VALUE'在C++中沒有輸入。 '100'的類型爲'int'。 – GManNickG
也可以考慮宏像'#define FOO 0f,0U'。假設宏有一個類型(一種類型),那麼會是什麼類型? – MSalters
@MSalters取決於逗號運算符的行爲和'FOO'的位置:'unsigned int a = FOO;'和'void f(float f,unsigned int i); f(FOO)'會產生不同的行爲。 –