Benim gibi çoğu C++ programcıları bir noktada aşağıdaki hatayı yaptılar:Yerel işlev bildirimleri için herhangi bir kullanım var mı?
class C { /*...*/ };
int main() {
C c(); // declares a function c taking no arguments returning a C,
// not, as intended by most, an object c of type C initialized
// using the default constructor.
c.foo(); // compiler complains here.
//...
}
Artık hata oldukça açıkken bunu bildiğinizde, bu tür yerel işlev bildirimleri için herhangi bir mantıklı kullanım olup olmadığını merak ettim Bunu yapabileceğiniz - özellikle 'in gibi bir yerel fonksiyonun aynı blokta tanımlanmasının bir yolu olmadığı için; başka bir yerde tanımlamanız gerekiyor.
Bence, Java tarzı yerel sınıflar, özellikle anonim bir şekilde, sık kullanma eğiliminde olan oldukça hoş bir özellik. Yerel C++ sınıfları (hatta satır içi tanımlanmış üye işlevleri olabilir) bile bazı kullanımları vardır. Ama tanımsız bu yerel işlev beyanı bana çok garip geliyor. Sadece bir C-mirası mı yoksa farkında olmadığım bazı daha derin kullanım durumları mı var?
İnançsızlar için dosyasını düzenleyin: C c()
, değil bir fonksiyon işaretçisi beyanıdır.
Bu program
int main()
{
void g();
cout << "Hello ";
g();
return 0;
}
void g()
{
cout << "world." << endl;
}
çıkış Hello world.
Bu program
void fun()
{
cout << "world." << endl;
}
int main()
{
void g();
g = fun;
cout << "Hello ";
g();
return 0;
}
derlenmiyor. gcc şikayet ediyor:
error: cannot convert 'void()()' to 'void()()' in assignment
comeau:
error: expression must be a modifiable lvalue
GCC hata mesajının yanlış olduğunu unutmayın (bilinen hata). "Error: 'void()' öğesini atamada 'void()' yapamaz", ancak aslında "type-id" işlevini yanlış olarak çözer. ("void()()" yerine, bir işlevi döndüren (yasadışı tip) bir işlev yerine, "void()") –
ilgili soru: http://stackoverflow.com/questions/928992/nested -Functions-are-not-değil-ama-neden-nested-function-prototip-izin verilir –
Gcc hata mesajı bir hata olduğundan emin değilim - aslında ekstra bir parantez çifti ile işlevi ilan edebilirsiniz void (g)() ', fonksiyon işaretçileri ile çalışırken gerekenler:' void * g() 'bir void *' döndüren bir fonksiyondur, void (* g)() 'bir fonksiyonun işaretçisidir. tür, iyi, 'void()()', yani hiçbir argüman almayan ve hiçbir şey döndürmeyen. – Tobias