可能重複:
In C++ classes, why the semi-colon after the closing braceC++分類後的分號,結構,枚舉,...沒用,但編譯器仍然發出錯誤?
這是我一直想知道關於相當長的一段時間,你爲什麼要放一個分號一類的右括號,結構或之後enum在C++中?
更糟糕的是(或者真正的問題),爲什麼編譯器會發出關於它的錯誤?
將分號放在那裏真的很重要嗎?爲什麼?
可能重複:
In C++ classes, why the semi-colon after the closing braceC++分類後的分號,結構,枚舉,...沒用,但編譯器仍然發出錯誤?
這是我一直想知道關於相當長的一段時間,你爲什麼要放一個分號一類的右括號,結構或之後enum在C++中?
更糟糕的是(或者真正的問題),爲什麼編譯器會發出關於它的錯誤?
將分號放在那裏真的很重要嗎?爲什麼?
它是C的剩餘部分。您可以在cladd/struct/enum聲明後聲明變量。驗證碼:
class A{};
A a;
是相同的:
class A{} a;
編譯器需要;
知道你不想類聲明後,聲明變量。
爲什麼你必須在C++中的類,結構或枚舉的後括號之後加上一個分號?
真正的答案,因爲C++標準是這樣說的。該語言的設計方式使每個聲明都必須以;
結尾。
一個類對象可以被聲明爲:
class MyClass
{
//Members
}obj;
並且因此在;
支架的端部。
更糟糕的(或實際的問題),爲什麼編譯器發出錯誤時,他們可以簡單地發出警告?
當懷疑的東西可能是錯誤的或潛在的危險,編譯器會發出警告
當程序不遵循該標準中規定的語法準則,而忽略了分號,編譯器將發出錯誤在你提到的情況下違反了C++標準提到的語法規則,因此也是錯誤。
將分號放在那裏真的很重要嗎?爲什麼?
是的。這可能有用。
您可以定義一個結構,並可以申報對象:
struct A
{
//members
} obj;
obj
是A
類型的對象,並且聲明這只是如上圖所示。它是在相同的方式,把分號聲明變量之後,如:
int i; //declares i of type int
std::string s; //declares s of type std::string
struct {int x,y,z;} point; //declares point of an unnamed struct type
這裏前兩個聲明看起來很熟悉,但最後一個看起來略顯陌生,因爲它定義了一個不願透露姓名的結構,並同時聲明一個對象稱爲point
未命名的結構。
底線是,在統一聲明對象後放置分號,無論聲明對象的方式如何,無論其類型如何。
不僅如此,你甚至可以typedef
以統一的方式:
typedef int my_int;
typedef std::string my_string;
typedef struct {int x,y,z;} my_point;
現在,所有這些my_int
,my_string
和my_point
的類型。
但是,如果你們兩個都不做(即既不聲明對象也不定義typedef),那麼你只需簡單地留下空白處,不要聲明/定義任何東西。但需要指出的是,它始終爲您提供了一個有趣而實用的功能。
類,結構和枚舉的定義是,定義。和C一樣,C中的定義必須以分號結束。 如果你不把它會有很多歧義:
struct X
{
} //no ;
foo() //no return value
{
}
這被解讀爲一個函數foo
返回一個結構,而不是結構和返回(中省略)的整數的函數。這是有效的C,但不是C++。
int *x;
void foo()
{
struct S { } //no ;
*x = 3; // <--- what is this?
}
是第二x
pointer-to-S
類型的局部變量,或者是全球x
的參考?你根本無法分辨。
還有很多其他的例子,如果你嘗試的話,你可能會想到幾個例子。
函數定義不需要分號,仍然被視爲定義。 –
確實如此,名稱空間也是如此。是的,我過度概括了一下... – rodrigo