2012-06-26 14 views

Odpowiedz

11

Ilość w czystej przenośnego C++ programu, argv argumentu, jeżeli występuje, ma const modyfikatory.

Edit: W punkcie 3.6.1.2 projektu standardu C++ 11, który (w wersji Mam przed sobą) stwierdza:

Implementacja nie ma predefine główną funkcję. Ta funkcja nie może być przeciążona. Musi mieć typ zwrotu int, ale , w przeciwnym razie jego typ jest definiowany przez implementację. Wszystkie implementacje dopuszcza oba następujące definicje główny:

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

i

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

3

Zależy co masz na myśli przez przenośne. Zła implementacja C++ może odrzucić to na podstawie tego, że jego podpis, int(int,char const*const*), różni się od jednej z wymaganych dozwolonych sygnatur, int() i int(int,char**). (Zła realizacja może odrzucić auto main(int argc,char* argv[]) -> int pozornie lub rzeczywiście żadnej definicji main gdzie ciało nie jest { /* ... */ })

Jednak to nie jest typowy. Nie znam żadnych implementacji, w których dodanie stałej spowodowałoby problem z wywołaniem main, a ponieważ C++ 11 dodał bit o "podobnych" typach, nie będzie naruszać zasady ścisłego aliasingu podczas uzyskiwania dostępu do obiektu char** poprzez char const * const * zmienna.

Podczas gdy zgodna implementacja mogłaby technicznie go odrzucić, myślę, że będzie ona przenośna dla każdej implementacji, z której możesz skorzystać.

+0

Gosh, nie zdawałem sobie sprawy, że dodanie podobnych typów do legalnych aliasów miało na celu włączenie funkcji, których dostarczone argumenty i parametry formalne miały źle dobrane typy ;-) Ale tak, prawdopodobnie po prostu zadziała (TM). –

+0

@SteveJessop Nie ma na celu włączenia tego, aw rzeczywistości nie włącza tego ogólnie, ponieważ dodanie 'const' do formalnego parametru wpłynie na mangling nazw. Powodem, dla którego to działa dla 'main' jest to, że' main' jest zwykle zwolniony z mangowania (ponieważ i tak nie możesz przeciążać głównego). Dodanie podobnych typów oznacza tylko, że nie otrzymujesz automatycznie nieokreślonego zachowania za naruszenie ścisłej reguły aliasingu, gdy uzyskujesz dostęp do 'char **' jako 'char const * const *'. Udało się dobrze przed C++ 11 we wszystkich znanych implementacjach, ale technicznie było to UB. Teraz nie powinno być UB – bames53

+3

Czy zdarza Ci się mieć źródło lub standardową ofertę na 'auto main (int argc, char * argv []) -> int' będący innym podpisem? Czy 'int main (int argc, char ** argv)' nie jest też wtedy innym sygnaturą? –

Powiązane problemy