2015-02-12 19 views
6

I (. S 204, §8.3.6 olarak) bir süre önce C++11 standard draft geçmekte ve bu geldi edildi: C++ - İşlev kapsamları içindeki işlev bildirimleri?

void g(int = 0, ...); // OK, ellipsis is not a parameter so it can follow 

// a parameter with a default argument 
void f(int, int); 
void f(int, int = 7); 
void h() { 
    f(3); // OK, calls f(3, 7) 
    void f(int = 1, int); // error: does not use default 
    // from surrounding scope 
} 
void m() { 
    void f(int, int); // has no defaults 
    f(4); // error: wrong number of arguments 
    void f(int, int = 5); // OK 
    f(4); // OK, calls f(4, 5); 
    void f(int, int = 5); // error: cannot redefine, even to 
    // same value 
} 
void n() { 
    f(6); // OK, calls f(6, 7) 
} 

Bu

işlevlerine varsayılan argümanlarla yapmak zorunda. Hangi inme bana işlev bildirimleri işlev kapsamında ortaya çıktı gerçeği oldu. Neden? Bu özellik ne için kullanılır?

+0

Bunu yalnızca kapsam içinde çağrılacağını bildiğim bir işlevi bildirmek için kullandım. – Atul

+0

Kısa cevap, nadiren kullanıldığıdır. Teoride, (örneğin) bir değişkeniniz ve aynı ada sahip bir işleviniz varsa yararlı olabilir. Bir iç kapsamdaki bir beyan, bir dış kapsamda bir gizlenecektir. –

cevap

5

Bunu yapabileceğiniz konusunda hiçbir fikrim olmasa da, test ettim ve işe yarıyor. Ben aşağıda gibi sonradan tanımlanan işlevleri ileri-bildirmek için kullanabilir tahmin: Eğer ileri beyanı kaldırmak, program derlemek olmaz

#include <iostream> 

void f() 
{ 
    void g(); // forward declaration 
    g(); 
} 

void g() 
{ 
    std::cout << "Hurray!" << std::endl; 
} 

int main() 
{ 
    f(); 
} 

. Böylece bu şekilde bir çeşit kapsam temelli ileri bildirim görünürlüğüne sahip olabilirsiniz.

+0

Hmm, Tamam, biraz zaman yararlı olabilir! :) –

+2

@HenriKorpela Bunu bilmediğimi söylemeliyim ve böyle bir "özellik" kullanacağımı düşünmüyorum. ** Fonksiyonları diğer fonksiyonların içinde tanımlayabilmek için ** tercih ettim, daha sonra “struct/class” içinde 'static' olarak sarma yapmanın sık sık gerekliliğine gerek kalmadan. – vsoftco

+0

Hiç bir sinir bozucu parse duydun mu? Yanlışlıkla bir örnek yerine bir işlevi bildirebilirsiniz. İnsanlar genellikle 'Foo f()' yi düşünürler ve 'f' için varsayılan yapıcıyı çağırır ve çağırır, ancak bunun yerine bir işlev bildirir. – 0x499602D2

0

Herhangi bir işlev/değişken bildiriminin görünürlüğü ve kapsamı vardır. Örneğin, sınıfta, sadece sınıf üyeleri bunu görebilir. Eğer fonksiyonda ise, fonksiyon veya değişken bildirildikten sonra sadece fonksiyon görünür olabilir.

Genellikle veri kapsamını işlev kapsamı içinde kullanırız. Ancak, derleyicinin dilbilgisi kuralı her ikisine de uygulanabilir, çünkü kendi içinde işlevin adresi vardır ve dolayısıyla görünürlük bunun için de geçerlidir.

+0

Bir işlevin başka bir işlev içindeki bir bildiriminin yararlı bir örneği için – vsoftco

+0

Evet, esas olarak kapsamı hakkında. – Atul

+0

Bu doğru olduğunu düşünmüyorum. Kapsam kapsamı dışında olduğu için, tamamen kapsam ile ilgili değildir, çünkü işlevi global kapsamda tanımlamanız gerekir (kurs sınıf üyeleri hariç). Sadece yukarıda beyan edilen işlevler kullanılamaz. – vsoftco