2012-04-03 42 views
11

Có một lý do cụ thể khiến một số người đặt dấu chấm phẩy sau khung chức năng đóng dấu xoăn không?Dấu chấm phẩy sau hàm

void foo() { 

}; 
+0

Có thể họ muốn nhận được sự nhất quán với định nghĩa lớp học? Đây không phải là ý tưởng hay nhất, tôi nghĩ vậy. –

+0

Dấu chấm phẩy C++ được sử dụng để báo cho trình biên dịch biết câu lệnh kết thúc ở đâu. Phần thân của một hàm hoặc bất kỳ khối phạm vi nào không phải là một câu lệnh trong và chính nó vì vậy nó chỉ cần thiết sau khi '}' khi định nghĩa một đối tượng. Việc có thêm các câu lệnh ';' hoặc trống không đặc biệt bị tổn thương nhưng có thể tạo ra các cảnh báo hoặc lỗi trên một số trình biên dịch. – AJG85

+0

Tôi nghi ngờ có thể sao chép/dán lỗi hoặc hiểu nhầm rằng chúng không cần thiết. –

Trả lời

15

Không thực sự, dấu chấm phẩy ở đó không có sự khác biệt. Nó có thể là một vấn đề của thói quen.

Bạn có thể đặt nhiều dấu chấm phẩy nếu bạn muốn mặc dù trong C++ 11:

void foo() { 

};;;;;;;; 
+2

.... nhưng chỉ từ C++ 11. –

+2

@LuchianGirgore: "Khai báo trống" được giới thiệu trong C++ 11. http://stackoverflow.com/questions/4335024/grammar-of-ac-translation-unit –

+1

Hoặc tại đây: http://stackoverflow.com/questions/ 5487849/phải-ac-class-function-end-with-a-or-only-a –

2

Không, nó chỉ đơn giản là bỏ qua. Trông giống như một lỗi đánh máy.

1

Dấu chấm phẩy phải tuân theo khung đóng ngoặc nhọn định nghĩa lớp. Nó không được yêu cầu sau khi định nghĩa hàm thành viên lớp bên trong định nghĩa lớp. Là bắt buộc mặc dù sau khi khai báo hàm thành viên lớp một mình bên trong định nghĩa lớp.

#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

Để rõ ràng, nó phải tuân theo định nghĩa lớp, nhưng không bắt buộc * bên trong * lớp sau các định nghĩa hàm thành viên lớp. –

1

Câu trả lời cho câu hỏi của bạn phụ thuộc vào phạm vi mà định nghĩa chức năng này được thực hiện.

Nếu bạn xác định hàm như vậy trong phạm vi không gian tên, thì dấu kiểm sau ; không liên quan gì đến định nghĩa hàm. Nó đơn giản cấu thành một định nghĩa rỗng riêng biệt, theo định nghĩa hàm. Các định nghĩa trống là hợp pháp trong phạm vi không gian tên trong C++ hiện đại. Điều này cũng có nghĩa là trong phạm vi không gian tên bạn có thể thêm nhiều dấu chấm phẩy thừa thừa như bạn muốn.

Nếu bạn xác định chức năng như vậy trong phạm vi lớp, thì bạn luôn được phép thêm một tùy chọn ; vào cuối định nghĩa. ; là một phần không thể tách rời của định nghĩa hàm và được phép ngữ pháp rõ ràng. I E. trong phạm vi lớp học theo sau ; không cấu thành định nghĩa trống độc lập. Hơn nữa, các định nghĩa trống không được phép trong phạm vi lớp. Điều này có nghĩa là trong phạm vi lớp, bạn chỉ có thể thêm một tùy chọn ; sau khi định nghĩa hàm, nhưng không được thêm.

Các vấn đề liên quan