クラス宣言中括弧の後のセミコロン


82

C ++クラスでは、なぜ閉じ中括弧の後にセミコロンがあるのですか?私は定期的にそれを忘れてコンパイラエラーが発生するため、時間が失われます。私にはやや不必要に思えますが、そうではない可能性があります。人々は本当に次のようなことをしますか?

class MyClass
{
.
.
.
} MyInstance;

構造体と列挙型のC互換性の観点から取得しますが、クラスはC言語の一部ではないため、主に類似の宣言構造体間の一貫性を維持していると思います。

私が探していたのは、何かを変更できるというよりも、設計の根拠に関連していましたが、優れたコード補完IDEは、コンパイル前にこれをトラップする可能性があります。


4
これは役立つかもしれません:cpptalk.net/…–
Michael Haren

@マイケル、リンクをありがとう。歴史的な観点からは、それは理にかなっています。C++ですべてのC文法が許可され、C ++クラスが構造体と同義である場合、クラスの最後に必要なセミコロンが残ります。
SmacL 2009

3
@ブライアン、うん深刻な質問。私はそれと一緒に暮らさなければならないことをよく知っていますが、設計と実装の背後にある理論的根拠に興味があります。
SmacL 2009

わかりましたが、質問を編集して、必要な設計根拠を含める必要があります。そのままでは、「なぜ中かっこなのか」などの質問をするように促します。:) StroustrupのC ++のデザインと進化を読むことに興味があるかもしれませんが、クラスの最後のセミコロンよりも重い問題をカバーしています。
ブライアンニール

@ブライアン、十分に公平で、それをウィキするかどうかについては境界線でした。大規模なビルドで定期的に使用されるヘッダーのセミコロンを省略した後、質問が行われました。それは私に30分かかりました、それ故にSOへの訪問。あなたの提案に従って編集された質問。
SmacL 2009

回答:


47

言語では、型宣言の閉じ中括弧の後のセミコロンが必要です。Cの初期のバージョン以来、そのようになっています。

そして、はい、人々は確かにあなたがちょうどそこに置いた宣言をします。メソッド内にスコープタイプを作成するのに役立ちます。

void Example() {
  struct { int x; } s1;
  s1.x = 42;

  struct ADifferentType { int x; };
}

この場合、セミコロンが必要な理由は明らかだと思います。ヘッダーファイルで宣言するより一般的なケースでなぜそれが必要なのかについては、私にはわかりません。私の推測では、これは歴史的なものであり、コンパイラーの作成を容易にするために行われたものです。


MyInstanceを指定せずにスコープタイプを作成できないのはなぜですか?新しい型の宣言と新しい変数の宣言という2つのアクションを組み合わせると、奇妙なことになります。
Mykola Golubyev 2009

@Mykolaあなたは両方を行うことができます。私が追加したサンプルを参照してください
JaredPar 2009

71

リンク@MichaelHarenによって提供さは、提供するために、表示された根本的な原因を。セミコロン(他の人が指摘しているように)はCから継承されます。しかし、それはCがそもそもそれを使用した理由を説明していません。ディスカッションには、この例の宝石が含まれています。

struct fred { int x; long y; }; 
main() 
{ 
  return 0; 
} 

古いバージョンのCには、特に宣言されていない限り、関数からの暗黙的なint戻り値の型がありました。;構造体定義の最後でを省略すると、新しい型を定義するだけでなく、のインスタンスを返すfredことmain()を宣言しますfred。つまり、コードは次のように解析されます。

struct fred { int x; long y; } main()
{ 
  return 0; /* invalid return type, expected fred type */
} 

1
ええ、暗黙のint戻り値の型は、ここまでのすべてを有効にします。素敵な宝石
Gaspa 7919

17

グループ化に中括弧が必要な場合でも、クラスは宣言であるためだと思います。そして、はい、Cではあなたができるので歴史的な議論があります

struct
{
  float x;
  float y;
} point;

C ++でも同様のことができるはずですが、class宣言が同じように動作することは理にかなっています。


11

の略です

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

クラス宣言の中括弧の後のセミコロンは実際にはやり過ぎですが、それがC ++の定義方法です。変数宣言の後のセミコロンは常に必要であり、意味があります。


1
それで、C ++は各宣言の後にセミコロンを必要としますか?
Loai Nagati 2009年

1
この方法では、匿名クラスのオブジェクトを作成することはできませんが、その逆は可能であることに注意してください。
ケビン

5

私はそのような宣言を使用しません

class MyClass
{
.
.
.
} MyInstance;

しかし、この場合、なぜセミコロンがそこにあるのか理解できます。
それはint a;-変数宣言のようなものだからです。

'MyInstance'セミコロンを省略できるため、おそらく一貫性が保たれます。


3

struct互換性の理由から、の後に必要になります。これをどのように行いますか。

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency

1
しかし、どうnamespace myNamespace { ... } // inconsistent but validですか?
クリス

3

C / C ++では; ステートメントターミネータです。すべてのステートメントは;で終了します。あいまいさを回避するため(および解析を簡素化するため)。文法はこの点で一貫しています。クラス宣言(またはそのことに関する任意のブロック)は複数行の長さであり、{}で区切られていますが、それでも単なるステートメント({}はステートメントの一部)であるため、;で終了する必要があります。(;は区切り文字/区切り文字ではありません)

あなたの例では

class MyClass{...} MyInstance;

完全なステートメントです。宣言されたクラスの複数のインスタンスを1つのステートメントで定義できます

class MyClass{...} MyInstance1, MyInstance2;

これは、1つのステートメントでプリミティブ型の複数のインスタンスを宣言することと完全に一致しています。

int a, b, c;

このようなクラスとインスタンスの宣言があまり見られない理由は、インスタンスが「しか」できないからです。グローバル変数であり、静的またはプレーンオールドデータ構造、あるいはその両方でない限り、グローバルオブジェクトはあまり必要ありません。


2
ただし、関数定義もステートメントですが、セミコロンはありません。
Jiapeng Zhang 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.