2012-04-03 21 views
11

中括弧閉じ括弧の後にセミコロンを置く特定の理由はありますか?関数後のセミコロン

void foo() { 

}; 
+0

多分、クラス定義と一貫性を持たせたいでしょうか?これは最善の考えではない、と私は思う。 –

+0

C++セミコロンは、ステートメントが終了する場所をコンパイラに伝えるために使用されます。関数やスコープブロックの本体は、それ自身の中のステートメントではないので、オブジェクトを定義するときに '}'の後に必要なのはたいていの場合です。余分な ';'や空文を置くことは特に害はないものの、コンパイラによっては警告やエラーが発生することがあります。 – AJG85

+0

私はコピー/貼り付けの誤り、またはそれらが不要であるという誤解を疑うでしょう。 –

答えて

15

実際にはセミコロンは違いはありません。それはおそらく習慣の問題です。

あなたがC++ 11にかかわらたい場合は、できるだけ多くセミコロンを置くことができます。

void foo() { 

};;;;;;;; 
+2

....しかし、C++ 11以降のみです。 –

+2

@LuchianGirgore: "空の宣言"はC++ 11で導入されました。http://stackoverflow.com/questions/4335024/grammar-of-ac-translation-unit –

+1

またはhttp://stackoverflow.com/questions/ 5487849/shall-ac-class-function-end-a-or-only-a- –

2

をいや、それは単に無視されます。タイプミスのように見えます。

1

セミコロンは、クラス定義の中かっこで囲まれている必要があります。クラス定義内でクラスメンバ関数定義の後には必須ではありません。 Isは、クラスメンバ関数の宣言の後でも、クラス定義の内部だけでは必要です。

#ifndef FRAME_COUNTER_H 
#define FRAME_COUNTER_H 

#include <iostream> 

#include <SDL/SDL.h> 

const Uint32 FPS = 60; 
const Uint32 DELAY_TIME = 1000.0f/FPS; 


class FrameCounter { 

public: 
    FrameCounter(); 

    void setFPS(int FPS) { m_FPS = FPS/(m_frameAccumulator/1000); } 

    void start() { m_frameStart = SDL_GetTicks(); } 

    void run(); 

    void reset() {} 

    void print() { printf("\nFPS: %5.1f\n", m_FPS); } 

private: 
    int m_frameNumber; 

    Uint32 m_frameStart; 
    Uint32 m_frameDuration; 
    Uint32 m_frameAccumulator; 

    double m_FPS; 
}; 

#endif 
+1

明確にするには、クラス定義に従う必要がありますが、クラスメンバー関数定義の後の*クラス内では必須ではありません。 –

1

あなたの質問に対する答えは、この関数の定義が行われる範囲によって異なります。

名前空間スコープでこのような関数を定義すると、末尾の;は関数定義とは関係ありません。単に関数定義に続く別の空の定義を構成します。空の定義は、現代のC++の名前空間の範囲では合法です。これは、名前空間のスコープで余分な余分なセミコロンを必要なだけ追加できることを意味します。

クラススコープでこのような関数を定義すると、定義の最後にオプションの;を追加することは常に許可されています。そのような;は、関数定義の不可欠な部分であり、文法によって明示的に許可されています。私。末尾が;であるクラススコープでは、独立した空の定義を構成しません。さらに、空の定義はクラススコープでは許可されません。つまり、クラススコープでは、関数定義の後にオプションの;を1つだけ追加できますが、これ以上は追加できません。

関連する問題