가 사용하는 이유는'자동차'키워드에서는 C++03?
문제
참고 이 질문은 원래에 게시는 2009 년,전 C++11 승격되었고기의 의미
auto
키워드가 크게 변경되었습니다.대한 답변 제공에 관계 만 C++03 의 의미auto
--는 저장소 지정된 클래스--그리고 아 C++11 의 의미auto
--는 자동적인 유형 감점한다.는 경우에 당신은 당신을 찾고 있는지에 대해 조언할 때 사용하는 C++11auto
, 이 질문은 타당하지 않는 질문입니다.
을 위해 긴 시간 동안 나는 생각이 없었을 사용하는 이유 static
키워드 C 기 때문에 변수를 선언한 외부의 블록 범위었다는 암시적으로 글로벌입니다.그럼 내가 발견되는 변수를 선언로 static
내 블록 범위는 것을 영원한 기간,그리고 선언하는 그 밖의 블록 범위(프로그램의 범위)이 파일의 범위(에서 액세스할 수 있습니다는 편집 단위).
그래서 이 나만으로는 키워드 중 하나는(아마도)지 않는 아직 완전히 이해하기:이 auto
키워드입니다.은 거기에 다른 어떤 의미는 그것을 이외의 지역 변수가?' 아무것도 그것은 않지 않는 암시적으로 수행을 위해 당신을 어디든지 사용할 수 있다?어떻게 auto
변수에서 동작하는 프로그램 범위는?What 의 static auto
변수에 파일을 범위?이 키워드가 있는 어떤 목적 이외의 다른 그냥 기존의 완전성?
해결책
auto
스토리지 클래스 지정자입니다. static
, register
그리고 extern
도. 선언 에서이 네 가지 중 하나만 사용할 수 있습니다.
로컬 변수 (없음 static
)는 자동 저장 시간이 있습니다. 즉, 정의 시작부터 블록 끝까지 살아갑니다. 어쨌든 기본값이기 때문에 자동차를 앞에 두는 것이 중복됩니다.
C ++에서 사용해야 할 이유는 모르겠습니다. 암시 적 INT 규칙이있는 기존 C 버전에서는 다음과 같이 변수를 선언하는 데 사용할 수 있습니다.
int main(void) { auto i = 1; }
유효한 구문을 만들거나 대용 할당 표현을 명확하게하기 위해 i
범위에 있습니다. 그러나 이것은 어쨌든 C ++에서는 작동하지 않습니다 (유형을 지정해야 함). C ++ 표준은 다음과 같이 씁니다.
블록 스코프에서 스토리지 클래스 스펙 시페이이저없이 선언하거나 함수 매개 변수로 선언 된 객체는 기본적으로 자동 저장 시간이 있습니다. [참고 : 따라서 자동 지정자는 거의 항상 중복되며 자주 사용되지 않습니다. Auto의 한 가지 사용은 선언 진술을 표현 상태 (6.8)와 명시 적으로 구별하는 것입니다. - 끝 참고
다음 시나리오를 말하며 캐스트 일 수 있습니다. a
에게 int
또는 변수 선언 a
유형의 int
주변에 중복 괄호가 있습니다 a
. 항상 선언으로 간주됩니다. auto
여기에 유용한 것을 추가하지는 않지만 대신 인간에게는 도움이 될 것입니다. 그러나 다시, 인간은 주변의 중복 괄호를 제거하는 것이 더 나을 것입니다. a
, 내가 말할 것:
int(a);
새로운 의미와 함께 auto
C ++ 0x로 도착하면 C ++ 03의 의미로 코드의 의미로 사용하지 않아도됩니다.
다른 팁
C ++ 11에서 auto
새로운 의미가 있습니다 : 변수의 유형을 자동으로 추론 할 수 있습니다.
그것이 왜 유용한가? 기본 예를 고려해 봅시다 :
std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
// Do stuff here
}
그만큼 auto
타입 반복자가 생성됩니다 std::list<int>::iterator
.
이것은 심각하게 복잡한 코드를 훨씬 쉽게 읽을 수 있습니다.
또 다른 예:
int x, y;
auto f = [&]{ x += y; };
f();
f();
거기, auto
Lambda 표현식을 변수에 저장하는 데 필요한 유형을 추론했습니다. Wikipedia는 좋다 주제에 대한 보도.
자동 키워드는 현재 목적이 없습니다. 당신은 그것이 로컬 변수의 기본 스토리지 클래스를리스트하는 것이 정확히 옳습니다. 정말 유용한 대안입니다. static
.
그것은 있습니다 새로운 의미 C ++ 0x에서. 그것은 당신에게 그것이 얼마나 쓸모 없는지에 대한 아이디어를 제공합니다!
GCC는 특별한 사용을 가지고 있습니다 auto
중첩 된 기능은 참조하십시오 여기.
정의 전에 호출하려는 기능을 중첩 한 경우 auto
.
"자동"은 컴파일러가 변수를 어디에 두어야하는지 (메모리 또는 레지스터) 자체를 결정하도록 지시합니다. 그것의 아날로그는 "레지스터"이며, 이는 컴파일러가 레지스터에 보관하도록 노력할 것입니다. 현대 컴파일러는 두 가지를 무시하므로 당신도해야합니다.
이 키워드를 사용하여 기능이 중요 할 때 명시 적으로 문서화하고 스택 기반 프로세서를 위해 변수를 스택에 배치해야합니다. 이 기능은 함수 (또는 인터럽트 서비스 루틴)에서 돌아 오기 전에 스택을 수정할 때 필요할 수 있습니다. 이 경우 나는 다음을 선언합니다.
auto unsigned int auiStack[1]; //variable must be on stack
그런 다음 변수 외부에 액세스합니다.
#define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics
auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;
그래서 auto
키워드는 의도를 문서화하는 데 도움이됩니다.
Stroustrup에 따르면, "C 프로그래밍 언어"(4 판, C 11)에서 'Auto'의 사용은 다음과 같은 주요 이유 (섹션 2.2.2) 를가집니다 (Stroustrup 단어가 인용).
1)
정의는 코드의 독자에게 유형을 명확하게 볼 수있는 큰 범위에 있습니다.
'Auto'와 필요한 이니셜 라이저를 사용하여 한 눈에 변수의 유형을 알 수 있습니다!
2)
우리는 변수의 범위 또는 정밀도에 대해 명시하고 싶습니다 (예 : 플로트가 아닌 두 배)
제 생각에는 여기에 맞는 경우가 다음과 같습니다.
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)
'자동'을 사용하면 중복성을 피하고 긴 유형 이름을 쓰지 않습니다.
템플릿 반복자에서 긴 유형 이름을 상상해보십시오.
(섹션 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;
}
오래된 컴파일러에서 Auto는 로컬 변수를 전혀 선언하는 한 가지 방법이었습니다. 자동 키워드 나 그와 같은 Turbo C와 같은 오래된 컴파일러에서 로컬 변수를 선언 할 수 없습니다.
C ++ 0X의 자동 키워드의 새로운 의미는 MSDN의 Channel 9 사이트에서 발견 된 STL에서 자유롭게 볼 수 있고 다운로드 가능한 비디오 강의에서 Microsoft의 Stephan T. Lavavej에 의해 매우 훌륭하게 설명됩니다. 여기.
강의는 전체적으로 볼 가치가 있지만 자동 키워드에 대한 부분은 약 29 분 (약 29 분)입니다.
은 거기에 다른 어떤 의미'자동차'이외의 지역 변수가?'
지에서는 C++03.
아무것도 그것은 않지 않는 암시적으로 수행을 위해 당신을 어디든지 사용할 수 있다?
아무것도 어떠한,C++03.
어떻게 자동 변수에서 동작하는 프로그램 범위는?What 의 정적 자동 변수에 파일을 범위?
키워드가 허용되지 않는 외부의 함수/메서드는 몸입니다.
이 키워드가 있는 어떤 목적을[에서는 C++03]다른 것보다는 그냥 기존의 완전성을 위해?
놀랍게도,그렇습니다.C++디자인 기준에 포함되는 높은 수준의 호환성을 C.C 이 키워드는 없었는 진짜 이유를 금지하거나 재정의 그것의 의미에서는 C++.그래서,목적으로 한 적은 비호환성과 C.
이 키워드가 있는 어떤 목적이 C 이외 기존의 완전성을 위해?
나는 배운 하나만 최근:편의 포팅의 고대 프로그램에서 B.C 에서 진화한 언어라고 B 는 구문에 매우 유사하는 C.그러나,B 없었 유형을 지지 않습니다.유일한 방법으로 변수를 선언할 B 을 지정한 저장 형태(auto
나 extern
).다음과 같다:
자동 i;
이 구문은 여전히 작동에 해당하는
int i;
기 때문에 C,저장 클래스의 기본값 auto
, 고,이 유형의 기본값 int
.난 모든 프로그램에서 유래 B 과 포팅되었 C 말 그대로의 전체 auto
변수에는 시간입니다.
C++03 할 수 없는 C 스타일을 암시적 int 지만,그것은 보존하지 않음 오히 유용 auto
키워드기 때문에 달리 암시적 int,그것이 알려지지 않았다에서 어떤 문제가 발생합 구문의 C.