2012-06-26 27 views

cevap

11

sayılı ++ programı, argv bağımsız değişken, mevcut olduğu takdirde, herhangi bir const değiştiriciler sahiptir.

Düzenleme: bak Bölüm (versiyonunda karşımda var) C++ 11 taslak standardının 3.6.1.2 devletler:

bir uygulama ana fonksiyonu önceden tanımlamayı etmeyecektir. Bu işlev aşırı yüklenmeyecektir. Tip int türünde bir dönüş türüne sahip olmalıdır, ancak aksi takdirde türü uygulama tanımlıdır. Tüm uygulamalar ana aşağıdaki tanımların her ikisine de izin zorundadır:

int main(){ /*...*/ }

ve

3

int main(int argc, char* argv[]) { /* ... */ }

Eğer taşınabilir ile ne demek bağlıdır. Kötü bir C++ uygulaması, imzasının, int(int,char const*const*) imzasının, izin verilen zorunlu imzalardan ( int() ve int(int,char**)) farklı olduğu gerekçesiyle reddedebilir. (Kötü bir uygulama görünüşte auto main(int argc,char* argv[]) -> int veya aslında'un { /* ... */ } numaralı

reddetme biçimini reddedebilir. Ancak bu normal değildir. Bir const ekleyerek bir sorun neden main çağrı neden olur ve C++ 11 'benzer' türler hakkında bit eklediğinden bir nesnesine char const * const * aracılığıyla erişirken katı takma kuralı ihlal etmeyeceksiniz değişken.

Uygun bir uygulama teknik olarak bunu reddederken, kullanmayı düşünebileceğiniz herhangi bir uygulamaya taşınabilir olacağını düşünüyorum.

+0

Hukuki takma adlara benzer türler eklemenin, sağlanan argümanları ve biçimsel parametreleri yanlış eşleştirilen işlevleri olan işlevleri etkinleştirmeyi amaçladığını anlamamıştım ;-) Ama evet, muhtemelen yalnızca çalışır (TM). –

+0

@SteveJessop Bu özelliği etkinleştirmek amaçlanmamıştır ve aslında genel olarak bunu etkinleştirmez, çünkü 'const'i bir resmi parametreye eklemek ad manganlığını etkiler. Bunun “ana” için çalışmasının sebebi, çünkü “ana” nin genellikle manevra yapmaktan muaf tutulmasıdır (çünkü ana yola aşırı yükleme yapmanıza izin verilmez). Benzer türlerin eklenmesi, yalnızca 'char const' * char const * const * 'seçeneğine eriştiğinizde, katı takma kuralını ihlal ettiği için otomatik olarak tanımlanmamış davranışları otomatik olarak almadığınız anlamına gelir. Bildiğim tüm uygulamalarda C++ 11'den önce iyi çalıştı, ama teknik olarak UB idi. Şimdi UB – bames53

+3

olmamalıdır. Otomatik ana (int argc, char * argv []) -> int 'farklı bir imza olmak için kaynak veya standart bir alıntı yapmak ister misiniz? Int main (int argc, char ** argv) 'de farklı bir imza değil mi? –

İlgili konular