web-dev-qa-db-ja.com

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

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

class MyClass
{
.
.
.
} MyInstance;

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

私が探していたのは、何も変更できないというよりも設計の理論的根拠に関係していましたが、良いコード補完IDEはコンパイル前にこれをトラップするかもしれません。

71
SmacL

型宣言の右中括弧の後のセミコロンは、言語で必要です。 Cの最も初期のバージョンからこのようになっています。

そして、はい、あなたはちょうどあなたがそこに置いた宣言を人々が実際に行います。メソッド内でスコープ付きタイプを作成するのに便利です。

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

  struct ADifferentType { int x; };
}

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

43
JaredPar

@MichaelHarenによって提供される link は、根本原因を提供するようです。 (他の人が指摘したように)セミコロンは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 */
} 
_
58
Nathan

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

struct
{
  float x;
  float y;
} point;

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

15
unwind

の略です

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

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

8

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

あなたの例では

class MyClass{...} MyInstance;

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

class MyClass{...} MyInstance1, MyInstance2;

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

int a, b, c;

クラスとインスタンスのこのような宣言が頻繁に表示されない理由は、インスタンスが「のみ」でしたか?グローバル変数であり、静的および/またはプレーンオールドデータ構造でない限り、グローバルオブジェクトが必要になることはあまりありません。

3
Roger Nelson

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

class MyClass
{
.
.
.
} MyInstance;

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

「MyInstance」セミコロンを省略することができるため、おそらく一貫性のためにそこに留まります。

3
Mykola Golubyev

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

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