2012-04-03 19 views
11

के बाद सेमिकोलन क्या कोई विशिष्ट कारण है कि क्यों कुछ लोग घुंघराले बंद करने वाले फ़ंक्शन ब्रैकेट के बाद अर्धविराम डालते हैं?फ़ंक्शन

void foo() { 

}; 
+0

शायद वे कक्षा परिभाषाओं के साथ स्थिरता प्राप्त करना चाहते हैं? मुझे लगता है कि यह सबसे अच्छा विचार नहीं है। –

+0

सी ++ अर्धविराम का उपयोग कंपाइलर को बताने के लिए किया जाता है जहां एक कथन समाप्त होता है। किसी फ़ंक्शन या किसी भी स्कोप ब्लॉक का बॉडी स्वयं में एक कथन नहीं है, इसलिए ऑब्जेक्ट को परिभाषित करते समय इसे '}' के बाद केवल इतना ही आवश्यक है। अतिरिक्त ';' या खाली बयान होने से विशेष रूप से चोट नहीं होती है लेकिन कुछ कंपाइलरों पर चेतावनियां या त्रुटियां उत्पन्न हो सकती हैं। – AJG85

+0

मुझे कॉपी/पेस्ट त्रुटियों, या एक गलतफहमी पर संदेह होगा कि वे अनियंत्रित हैं। –

उत्तर

15

वास्तव में, अर्धविराम में कोई फर्क नहीं पड़ता। यह शायद आदत का विषय है।

void foo() { 

};;;;;;;; 
+2

.... लेकिन केवल सी ++ 11 के बाद से। –

+2

@ लुचियानगिरोर: "खाली घोषणा" सी ++ 11. में पेश की गई थी। Http://stackoverflow.com/questions/4335024/grammar-of-ac-translation-unit –

+1

या यहां: http://stackoverflow.com/questions/ 5487849/एएस-एसी-क्लास-फ़ंक्शन-एंड-ए-या-केवल- –

2

नहीं, यह बस नजरअंदाज कर दिया है:

आप सी ++ 11 में हालांकि चाहते हैं के रूप में कई अर्धविराम डाल सकते हैं। एक टाइपो की तरह लग रहा है।

1

अर्धविराम वर्ग परिभाषा घुंघराले बंद ब्रैकेट का पालन करना होगा। कक्षा परिभाषा के अंदर वर्ग सदस्य कार्य परिभाषाओं के बाद यह आवश्यक नहीं है। कक्षा की परिभाषा के अंदर अकेले वर्ग सदस्य कार्य घोषणाओं के बाद भी आवश्यक है।

#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

आपके प्रश्न का उत्तर उस कार्यक्षेत्र पर निर्भर करता है जिसमें यह कार्य परिभाषा बनाई गई है।

यदि आप नेमस्पेस स्कोप में इस तरह के फ़ंक्शन को परिभाषित करते हैं, तो पिछला ; फ़ंक्शन परिभाषा से कोई लेना देना नहीं है। यह बस एक अलग खाली परिभाषा का गठन करता है, जो फ़ंक्शन परिभाषा का पालन करता है। आधुनिक सी ++ में नामस्थान स्कोप में खाली परिभाषाएं कानूनी हैं। इसका मतलब यह भी है कि नेमस्पेस स्कोप में आप जितनी चाहें उतने अतिरिक्त अतिरिक्त अर्धविराम जोड़ सकते हैं।

आप में वर्ग गुंजाइश इस तरह के समारोह निर्धारित करते हैं तो आप हमेशा परिभाषा के अंत में एक भी वैकल्पिक ; जोड़ने के लिए अनुमति दी गई है। इस तरह के ; फ़ंक्शन परिभाषा का एक अभिन्न अंग है और इसे व्याकरण द्वारा स्पष्ट रूप से अनुमति दी जाती है। अर्थात। कक्षा के दायरे में ; पीछे एक स्वतंत्र खाली परिभाषा नहीं है। इसके अलावा, कक्षा के दायरे में खाली परिभाषाओं की अनुमति नहीं है। इसका मतलब है कि कक्षा के दायरे में आप फ़ंक्शन परिभाषा के बाद केवल एक वैकल्पिक ; जोड़ सकते हैं, लेकिन अधिक नहीं।