C ++ 03에서 'auto'키워드를 사용하는 이유가 있습니까?


85

참고 이 질문에 C ++ (11)이 비준되기 전에 원래 2009에 게시했습니다과의 의미 전에 auto키워드 대폭 변경되었습니다. 제공된 답변 은 자동 유형 추론 의 C ++ 11 의미가 아니라 지정된 스토리지 클래스 라는 C ++ 03 의미 에만 관련 됩니다 . C ++ 11 사용시기에 대한 조언을 찾고 있다면 이 질문은 해당 질문과 관련이 없습니다.autoautoauto

오랫동안 staticC 에서 키워드 를 사용할 이유가 없다고 생각했습니다. 블록 범위 밖에서 선언 된 변수는 암시 적으로 전역 적이기 때문입니다. 그런 다음 static블록 범위 내 에서 변수를 선언 하면 영구 기간이 제공되고 블록 범위 외부 (프로그램 범위 내에서)로 선언하면 파일 범위가 제공된다는 것을 발견했습니다 (해당 컴파일 단위에서만 액세스 할 수 있음).

그래서 이것은 내가 (아마도) 아직 완전히 이해하지 못하는 하나의 키워드만을 남깁니다. 바로 auto키워드입니다. '로컬 변수'외에 다른 의미가 있습니까? 어디에서 사용하든 암묵적으로 수행되지 않는 작업이 있습니까? auto변수는 프로그램 범위에서 어떻게 작동합니까? static auto파일 범위 의 변수는 무엇입니까 ? 이 키워드는 완전성을 위해 존재 하는 것 외에 다른 목적을 가지고 있습니까?

답변:


74

auto스토리지 클래스 지정자입니다, static, registerextern도. 선언에서이 네 가지 중 하나만 사용할 수 있습니다.

로컬 변수 (가없는 static)는 자동 저장 기간을 가지며, 이는 정의 시작부터 블록 끝까지 존재 함을 의미합니다. 어쨌든 기본값이기 때문에 자동을 앞에 두는 것은 중복됩니다.

C ++에서 사용하는 이유를 모르겠습니다. 암시 적 int 규칙이있는 이전 C 버전에서는 다음과 같이이를 사용하여 변수를 선언 할 수 있습니다.

int main(void) { auto i = 1; }

유효한 구문으로 만들거나 case i가 범위 내에있는 경우 할당 식에서 명확하게하기 위해 . 그러나 이것은 어쨌든 C ++에서 작동하지 않습니다 (유형을 지정해야합니다). 재미있게도 C ++ 표준은 다음과 같이 씁니다.

블록 범위에서 스토리지 클래스 지정자없이 선언되거나 함수 매개 변수로 선언 된 객체는 기본적으로 자동 저장 기간을 갖습니다. [참고 : 따라서 자동 지정자는 거의 항상 중복되며 자주 사용되지 않습니다. auto의 한 가지 용도는 선언문을 표현 문 (6.8)과 명시 적으로 구별하는 것입니다. — 끝 참고]

그 중 캐스팅이 될 수있는 다음과 같은 시나리오를 의미 a하는 int나 변수의 선언 a유형의 int주위에 여분의 괄호를 가지고 a. 항상 선언으로 간주되므로 auto여기에 유용한 정보를 추가하지 않고 대신 인간을위한 것입니다. 그러나 다시 말하지만, 인간은 주위의 중복 괄호를 제거하는 것이 더 나을 a것입니다.

int(a);

autoC ++ 0x와 함께 도착 하는 새로운 의미로 인해 코드에서 C ++ 03의 의미와 함께 사용하지 않는 것이 좋습니다.


4
C ++ 컴파일러는 종종 표준 이전의 ARM에서 함수의 반환 값에 대해 암시 적 int를 사용하는 데 사용됩니다. EMPIRE 이전 ...
Daniel Earwicker

1
함수를 포워드 선언하는 것을 잊었다는 컴파일러 방식으로 인식했습니다. 내 함수 사용이 암시 적 int로 인해 선언 된 방식과 다르다는 것을 알 수 있습니다.
Carson Myers

29
가장 좋은 점은 프로그래머가 "int"(3 개의 문자)를 작성하지 않도록 "auto"(4 개의 문자)를 작성했다는 것입니다.
Max Lybbert

30
@Max-많은 사람들이 "World Wide Web"의 약어로 "double-u-double-u-double-u"를 말합니다.
Daniel Earwicker

3
@smichak no, "volatile"은 유형 한정자입니다. 값을 저장할 위치를 결정하는 대신 휘발성 한정 유형의 개체에 대한 쓰기 및 읽기 동작을 변경합니다. 휘발성 적격 스택 변수 (자동 스토리지 클래스)와 휘발성 적격 정적 스토리지 기간 변수 (로컬 '정적'스토리지 클래스, 비 로컬 변수)가있을 수 있습니다. 그 외에도 "register volatile"이 유효한 조합인지 모르겠습니다. :)
Johannes Schaub-litb

86

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람다 식을 변수에 저장하는 데 필요한 유형을 추론했습니다. Wikipedia는 주제에 대해다루고 있습니다.


4
이것이 자동을 잘 사용하는지 아직 확실하지 않습니다. 코드는 쓰기 쉽고 읽기 쉬워야합니다!
DanDan

38
나는 당신에 대해 잘 모르지만 반복자 유형 스팸보다 읽기가 훨씬 쉽습니다.
Overv

17
그리고 어떤 reson zou가 클래스를 list <int>에서 다른 클래스로 변경하기로 결정한 경우 모든 반복기 선언을 검색하고 변경할 필요가 없습니다.
roslav 2012-08-24

2
@KarateSnowMachine : const를 원하면 "auto"대신 "const auto"를 사용합니다.
darth happyface 2013

4
@darth는 const auto it = a.begin();당신에게 const를 줄 것 iterator아닌가 const_iterator. chould는 여전히 요소를 변경하지만 ++it컴파일에 실패합니다. 를 얻으려면 const_iterator, 당신은 사용합니다auto it = a.cbegin();
fredoverflow

35

auto 키워드는 현재 아무런 목적이 없습니다. 지역 변수의 기본 스토리지 클래스를 다시 작성하는 것이 맞습니다 static. 정말 유용한 대안은 .

그것은 C ++ 0x에서 새로운 의미 를 가지고 있습니다. 그것은 당신에게 그것이 얼마나 쓸모 없는지에 대한 몇 가지 아이디어를 제공합니다!


1
오 이런, 그게 쓸모 없어. 나는 새로운 의미를 좋아한다. 그것은 일부 코드를 훨씬 덜 장황하고 중복되게 만듭니다.
Carson Myers

예, C #에서 동등한 것을 사용하면 아마도 큰 차이를 만들 것입니다. 유형이 너무 복잡해서 손으로 작성하지 않으려는 식 템플릿을 사용하는 경우 C ++에서 더욱 그렇습니다.
Daniel Earwicker

7

GCC는 auto중첩 함수 에 대한 특수 용도를 가지고 있습니다 . 여기를 참조 하십시오 .

정의하기 전에 호출하려는 중첩 함수가있는 경우 auto.


이것은 컴파일러에 의존적이긴하지만 auto의 훌륭한 구현입니다. :) 연구 주셔서 감사합니다
카슨 마이어스

3

"auto"는 컴파일러에게 변수 (메모리 또는 레지스터)를 넣을 위치를 스스로 결정하도록 지시합니다. 그것의 아날로그는 "레지스터"인데, 이것은 컴파일러에게 레지스터에 그것을 유지하도록 지시하는 것으로 추정됩니다. 현대 컴파일러는 둘 다 무시하므로 여러분도 그렇게해야합니다.


1
정확히는 아닙니다. "register"로 선언하면 컴파일러에서 변수에 연산자 주소 (& foo)를 사용할 수 없습니다. 왜냐하면 메모리의 어디에도 존재하지 않기 때문입니다 (따라서 주소가 없음).
Tim Čas 2011

3

이 키워드를 사용하여 함수에 중요한시기, 스택 기반 프로세서의 경우 변수가 스택에 배치되는 경우를 명시 적으로 문서화합니다. 이 함수는 함수 (또는 인터럽트 서비스 루틴)에서 복귀하기 전에 스택을 수정할 때 필요할 수 있습니다. 이 경우 다음을 선언합니다.

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키워드는 의도를 문서화하는 데 도움이됩니다.


키워드는 단순히 생략하는 것 이상으로 실제로 스택 배치를 강제하지 않기 때문에 이것이 신호 의도 일 뿐이라고 가정합니다 .
underscore_d

2

Stroustrup에 따르면 "The C Programming Language"(4 판, C 11 포함)에서 'auto'를 사용하는 데는 다음과 같은 주요 이유가 있습니다 (섹션 2.2.2) (Stroustrup 단어가 인용 됨).

1)

정의는 우리가 코드를 읽는 사람이 유형을 명확하게 볼 수 있도록하는 넓은 범위에 있습니다.

'auto'와 필요한 이니셜 라이저를 사용하면 변수의 유형을 한 눈에 알 수 있습니다!

2)

변수의 범위 또는 정밀도에 대해 명시하고 싶습니다 (예 : float가 아닌 double).

제 생각에 여기에 맞는 경우는 다음과 같습니다.

   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;

삼)

'auto'를 사용하여 중복성을 피하고 긴 유형 이름을 작성합니다.

템플릿 화 된 반복자의 긴 형식 이름을 상상해보십시오.

(섹션 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;
}

1

이전 컴파일러에서 auto는 지역 변수를 선언하는 한 가지 방법이었습니다. auto 키워드 없이는 Turbo C와 같은 오래된 컴파일러에서 지역 변수를 선언 할 수 없습니다.


1

C ++ 0x에서 auto 키워드의 새로운 의미는 MSDN의 Channel 9 사이트에있는 STL에 대한 무료보기 / 다운로드 가능한 비디오 강의에서 Microsoft의 Stephan T. Lavavej에 의해 매우 잘 설명 됩니다. .

강의는 전체적으로 볼 가치가 있지만 auto 키워드에 대한 부분은 약 29 분 (대략)에 있습니다.


0

'로컬 변수'외에 '자동'에 다른 의미가 있습니까?

C ++ 03에는 없습니다.

어디에서 사용하든 암묵적으로 수행되지 않는 작업이 있습니까?

C ++ 03에서는 아무것도 없습니다.

자동 변수는 프로그램 범위에서 어떻게 작동합니까? 파일 범위의 정적 자동 변수는 무엇입니까?

함수 / 메소드 본문 외부에서 키워드를 사용할 수 없습니다.

이 키워드는 완전성을 위해 존재하는 것 외에 [C ++ 03에서] 목적이 있습니까?

놀랍게도 그렇습니다. C ++ 설계 기준에는 C와의 높은 수준의 하위 호환성이 포함되었습니다. C에는이 키워드가 있었으며이를 금지하거나 C ++에서 의미를 재정의 할 실제 이유가 없었습니다. 그래서 목적은 C와의 비 호환성이 하나 더 적었습니다.

이 키워드는 완전성을 위해 존재하는 것 외에 C에서 목적이 있습니까?

나는 최근에야 하나를 배웠습니다. B. C에서 고대 프로그램을 쉽게 이식 할 수 있다는 것은 구문이 C와 매우 유사한 B라는 언어에서 발전했습니다. 그러나 B에는 유형이 전혀 없었습니다. B에서 변수를 선언하는 유일한 방법은 저장소 유형 ( auto또는 extern) 을 지정하는 것 입니다. 이렇게 :

자동 i;

이 구문은 여전히 ​​C에서 작동하며 다음과 같습니다.

int i;

C에서 스토리지 클래스는 기본적으로 auto이고 유형은 기본적으로 int. B에서 시작되어 C로 포팅 된 모든 프로그램은 말 그대로auto 그 당시에 변수로 있었다고 생각합니다.

C ++ 03은 더 이상 C 스타일 암시 적 int를 허용하지 않지만 암시 적 int auto와 달리 C 구문에 문제를 일으키는 것으로 알려지지 않았기 때문에 더 이상 정확하지 않은 키워드를 보존 했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.