Zwróć uwagę, że to pytanie zostało pierwotnie opublikowane w 2009 r., Zanim C ++ 11 został ratyfikowany i zanim znaczenie
auto
słowa kluczowego zostało drastycznie zmienione. Udzielone odpowiedzi dotyczą tylko C ++ 03 znaczeniaauto
- czyli określonej klasy pamięci masowej - a nie znaczenia C ++ 11auto
- czyli automatycznego odejmowania typów. Jeśli szukasz porady, kiedy używać C ++ 11auto
, to pytanie nie dotyczy tego pytania.
Przez długi czas myślałem, że nie ma powodu, aby używać static
słowa kluczowego w C, ponieważ zmienne zadeklarowane poza zakresem bloków były niejawnie globalne. Potem odkryłem, że zadeklarowanie zmiennej jako mieszczącej się static
w zakresie blokowym nadałoby jej stały czas trwania, a zadeklarowanie jej poza zakresem bloku (w zakresie programu) dałoby jej zakres plikowy (można uzyskać do niego dostęp tylko w tej jednostce kompilacji).
Pozostaje mi więc tylko jedno słowo kluczowe, którego (być może) jeszcze w pełni nie rozumiem: auto
słowo kluczowe. Czy jest inne znaczenie niż „zmienna lokalna”? Cokolwiek robi, co nie jest robione domyślnie dla ciebie, gdziekolwiek chcesz go użyć? Jak zachowuje się auto
zmienna w zakresie programu? A co ze static auto
zmienną w zakresie pliku? Czy to słowo kluczowe ma inny cel niż tylko istnienie kompletności ?
W C ++ 11
auto
ma nowe znaczenie: pozwala automatycznie wywnioskować typ zmiennej.Dlaczego jest to kiedykolwiek przydatne? Rozważmy podstawowy przykład:
std::list<int> a; // fill in a for (auto it = a.begin(); it != a.end(); ++it) { // Do stuff here }
auto
Tam tworzy iterator typustd::list<int>::iterator
.Może to znacznie ułatwić odczytanie bardzo skomplikowanego kodu.
Inny przykład:
int x, y; auto f = [&]{ x += y; }; f(); f();
Tam
auto
wydedukował typ wymagany do przechowywania wyrażenia lambda w zmiennej. Wikipedia dobrze opisuje ten temat.źródło
const auto it = a.begin();
dałoby ci constiterator
, a nieconst_iterator
. Nadal możesz zmienić element, ale++it
skompilowanie się nie powiedzie. Aby otrzymaćconst_iterator
, należy użyćauto it = a.cbegin();
W tej chwili słowo kluczowe auto nie ma żadnego zastosowania. Masz rację, że po prostu odtwarza domyślną klasę pamięci zmiennej lokalnej, a naprawdę użyteczną alternatywą jest
static
.Ma zupełnie nowe znaczenie w C ++ 0x. To daje wyobrażenie o tym, jak bezużyteczne było to!
źródło
GCC ma specjalne zastosowanie
auto
dla funkcji zagnieżdżonych - zobacz tutaj .Jeśli masz zagnieżdżoną funkcję, którą chcesz wywołać przed jej definicją, musisz ją zadeklarować za pomocą
auto
.źródło
„auto” rzekomo mówi kompilatorowi, aby sam zdecydował, gdzie umieścić zmienną (pamięć lub rejestr). Jego analogiem jest „rejestr”, który rzekomo mówi kompilatorowi, aby próbował zachować go w rejestrze. Nowoczesne kompilatory ignorują oba, więc Ty też powinieneś.
źródło
Używam tego słowa kluczowego, aby jawnie udokumentować, kiedy jest to krytyczne dla funkcji, aby zmienna została umieszczona na stosie, dla procesorów opartych na stosie. Ta funkcja może być wymagana podczas modyfikowania stosu przed powrotem z funkcji (lub procedury obsługi przerwania). W tym przypadku oświadczam:
auto unsigned int auiStack[1]; //variable must be on stack
Następnie mam dostęp poza zmienną:
#define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;
Zatem
auto
słowo kluczowe pomaga udokumentować zamiar.źródło
Według Stroustrupa, w „The C Programming Language” (4. wydanie, obejmujące C 11), użycie słowa „auto” ma następujące główne przyczyny (sekcja 2.2.2) (cytowane są słowa Stroustrupa):
1)
Dzięki „auto” i jego niezbędnemu inicjalizatorowi możemy od razu poznać typ zmiennej!
2)
Moim zdaniem przypadek, który tu pasuje, to coś takiego:
double square(double d) { return d*d; } int square(int d) { return d*d; } auto a1 = square(3); cout << a1 << endl; a1 = square(3.3); cout << a1 << endl;
3)
Wyobraź sobie długą nazwę typu z iteratora opartego na szablonach:
(kod z sekcji 6.3.6.1)
template<class T> void f1(vector<T>& arg) { for (typename vector<T>::iterator p = arg.begin(); p != arg.end(); p) *p = 7; for (auto p = arg.begin(); p != arg.end(); p) *p = 7; }
źródło
W starym kompilatorze auto było w ogóle jednym ze sposobów zadeklarowania zmiennej lokalnej. Nie możesz deklarować zmiennych lokalnych w starych kompilatorach, takich jak Turbo C bez słowa kluczowego auto lub czegoś podobnego.
źródło
Nowe znaczenie słowa kluczowego auto w C ++ 0x zostało bardzo ładnie opisane przez Stephana T. Lavaveja z Microsoftu w ogólnodostępnym wykładzie wideo na temat STL, który można znaleźć na stronie MSDN Channel 9 tutaj .
Wykład warto obejrzeć w całości, ale część dotycząca słowa kluczowego auto znajduje się w około 29 minucie (w przybliżeniu).
źródło
Czy jest jakieś inne znaczenie słowa „auto” inne niż „zmienna lokalna”?
Nie w C ++ 03.
Cokolwiek robi, co nie jest robione domyślnie dla ciebie, gdziekolwiek chcesz go użyć?
Nic, w C ++ 03.
Jak zachowuje się zmienna automatyczna w zakresie programu? A co ze statyczną zmienną automatyczną w zakresie pliku?
Słowo kluczowe nie jest dozwolone poza treścią funkcji / metody.
Czy to słowo kluczowe ma inny cel [w C ++ 03] niż tylko istnienie dla kompletności?
O dziwo, tak. Kryteria projektowe C ++ obejmowały wysoki stopień wstecznej kompatybilności z C. C miało to słowo kluczowe i nie było żadnego powodu, aby go zakazać lub przedefiniować jego znaczenie w C ++. Tak więc celem była jedna niezgodność mniej z C.
Czy to słowo kluczowe ma inny cel w języku C niż tylko istnienie kompletności?
Dowiedziałem się jednego dopiero niedawno: łatwość przenoszenia starożytnych programów z B. C wyewoluowało z języka o nazwie B, którego składnia była dość podobna do składni C. Jednak B nie miał żadnych typów. Jedynym sposobem zadeklarowania zmiennej w B było określenie jej typu przechowywania (
auto
lubextern
). Lubię to:Ta składnia nadal działa w języku C i jest równoważna
ponieważ w C klasa pamięci jest domyślnie ustawiona na
auto
, a typ domyślny toint
. Wydaje mi się, że każdy program, który powstał w B i został przeniesiony do C, był wtedy dosłownie pełenauto
zmiennych.C ++ 03 nie zezwala już na implicit int w stylu C, ale zachował
auto
słowo kluczowe, które nie jest już dokładnie przydatne, ponieważ w przeciwieństwie do niejawnego int, nie było wiadomo, że powoduje jakiekolwiek problemy w składni C.źródło