문제

참고 이 질문은 원래에 게시는 2009 년,전 C++11 승격되었고기의 의미 auto 키워드가 크게 변경되었습니다.대한 답변 제공에 관계 C++03 의 의미 auto --는 저장소 지정된 클래스--그리고 아 C++11 의 의미 auto --는 자동적인 유형 감점한다.는 경우에 당신은 당신을 찾고 있는지에 대해 조언할 때 사용하는 C++11 auto, 이 질문은 타당하지 않는 질문입니다.

을 위해 긴 시간 동안 나는 생각이 없었을 사용하는 이유 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 을 지정한 저장 형태(autoextern).다음과 같다:

자동 i;

이 구문은 여전히 작동에 해당하는

int i;

기 때문에 C,저장 클래스의 기본값 auto, 고,이 유형의 기본값 int.난 모든 프로그램에서 유래 B 과 포팅되었 C 말 그대로의 전체 auto 변수에는 시간입니다.

C++03 할 수 없는 C 스타일을 암시적 int 지만,그것은 보존하지 않음 오히 유용 auto 키워드기 때문에 달리 암시적 int,그것이 알려지지 않았다에서 어떤 문제가 발생합 구문의 C.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top