2012-04-03 30 views
11

¿Hay alguna razón específica por la que algunas personas pongan un punto y coma después del corchete de la función de cierre curvo?Punto y coma después de la función

void foo() { 

}; 
+0

¿Quizás quieran ser consistentes con las definiciones de clase? Esta no es la mejor idea, creo. –

+0

El punto y coma de C++ se usa para indicar al compilador dónde termina una instrucción. El cuerpo de una función o cualquier bloque de alcance no es una afirmación en sí misma, por lo que es bastante necesario después de '}' al definir un objeto. Tener declaraciones ';' extra o vacías no duele particularmente pero puede generar advertencias o errores en algunos compiladores. – AJG85

+0

Sospecho que hay errores de copiar/pegar, o un malentendido de que no son necesarios. –

Respuesta

15

En realidad, el punto y coma allí no hace ninguna diferencia. Probablemente es una cuestión de hábito.

Se puede retener la mayor cantidad de puntos y comas si quieres aunque en C++ 11:

void foo() { 

};;;;;;;; 
+2

.... pero solo desde C++ 11. –

+2

@LuchianGirgore: La "declaración vacía" se introdujo en C++ 11. http://stackoverflow.com/questions/4335024/grammar-of-ac-translation-unit –

+1

O aquí: http://stackoverflow.com/questions/ 5487849/shall-ac-class-function-end-with-a-or-only-a –

2

No, es simplemente se ignora. Parece un error tipográfico.

1

El punto y coma debe seguir la definición de clase del corchete de cierre rizado. No es necesario después de las definiciones de las funciones de los miembros de la clase dentro de la definición de la clase. Es necesario, sin embargo, después de que el miembro de la clase funcione solo con las declaraciones dentro de la definición de la clase.

#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

Para que quede claro, debe seguir la definición de la clase, pero no se requiere * dentro * de las definiciones de función miembro de la clase después de la clase. –

1

La respuesta a su pregunta depende del alcance en que se realiza esta definición de función.

Si define dicha función en el ámbito del espacio de nombres, entonces el ; posterior no tiene nada que ver con la definición de la función. Simplemente constituye una definición vacía por separado, que sigue la definición de la función. Las definiciones vacías son legales en el ámbito del espacio de nombres en C++ moderno. Esto también significa que en el ámbito del espacio de nombres puede agregar tantos puntos y comas superfluos adicionales como desee.

Si define dicha función en el alcance clase, siempre se le ha permitido agregar un único ; opcional al final de la definición. Tal ; es una parte integral de la definición de la función y está explícitamente permitido por la gramática. Es decir. en el ámbito de clase que sigue ; no constituye una definición vacía independiente. Además, las definiciones vacías no están permitidas en el alcance de la clase. Esto significa que en el ámbito de clase solo puede agregar un ; opcional después de la definición de la función, pero no más.

Cuestiones relacionadas