C ++ 11에서 자동 키워드의 동기 및 함정 (?)


20

최근 auto에 C ++ 11에서 키워드 를 선택하여 컴파일러에서 유형을 유추 해야하는 변수를 표시하는 이유가 궁금 했습니다.

auto x = 1;

이후

  1. var 다른 프로그래밍 언어 (예 : C #, Scala, JavaScript)에서 더 일반적으로 보입니다.
  2. 내가 auto이전 버전과의 호환성 을 나누는 새로운 의미를 이해하는 한 (이전에는 거의 사용되지 않았지만 C ++의 이전 개정판에서 다른 의미를 가졌습니다. 여기 참조 )

선택해야 할 특별한 이유가 있는지 묻고 싶었습니다 auto( var다른 키워드 를 선호 하거나 다른 키워드). C ++ 11 표준이 출시되기 전에이 문제에 대한 구체적인 논의가 있었습니까?

또한 C ++ 11 컴파일러로 레거시 C ++ 코드를 다시 컴파일 할 때주의해야 할 비 호환성이 있습니까?


9
새로운 의미 체계는 auto이전 버전과의 호환성을 var떨어 뜨릴 수 있지만 auto11 이전 코드에서 키워드가 사용되는 빈도와 비교할 때 변수 이름으로 사용되는 빈도에 따라 위원회는 새로운 기능을 도입하는 것보다 호환성이 크게 떨어지지 않을 것이라는 의견을 내놓았을 수 있습니다 키워드 것입니다.
sepp2k

2
"현재로서는이 질문이 Q & A 형식에 적합하지 않습니다. 사실, 참조 또는 특정 전문 지식에 의해 답변이 뒷받침 될 것으로 예상되지만이 질문은 토론, 논쟁, 여론 조사 또는 확장 된 토론을 요구할 것입니다. 이 질문을 개선하고 다시 열 수 있다고 생각하면 안내를위한 FAQ를 참조하십시오. ":이 질문은 사실에 대한 질문입니다.이 주제에 대한 토론이 있었습니까? 가능한 대답은 YES와 NO입니다.
Giorgio

2
물론 토론이 있었는데, 그 점에서 질문을 좀 더 무의미하게 만듭니다. autovar질문은 텍스트의 90 %가 참조 무엇이며, 그 질문은 명확한 결과가 없습니다. (폐쇄 투표를 한 사람은
아니지만

1
@Telastyn :이 주제에 대한 토론이 있었다는 것을 알고 있다면 묻지 않았을 것입니다. "auto vs var C ++"또는 "auto C ++"에 대한 인터넷 검색은이 주제에서 아무 것도 반환하지 않았습니다.
Giorgio

1
autovarC #에 도입 되기 전에 C ++에 대해 제안 되었으므로 C #이 자동을 사용하지 않는 이유는 무엇입니까? var는 JavaScript와 Scala에서 다른 의미를 갖습니다
adrianm

답변:


37

언어에 키워드로 추가한다고 생각할 수있는 거의 모든 단어는 변수 이름이나 작업 코드의 다른 부분으로 사용되었습니다. 해당 단어를 키워드로 설정하면이 코드가 손상됩니다.

놀랍게도 운이 좋은 것은 auto그것이 이미 키워드 였기 때문에 사람들은 그 이름을 가진 변수가 없었지만 기본값이 아니기 때문에 아무도 사용하지 않았습니다. 왜 입력 :

auto int i=0;

언제

int i=0;

정확히 같은 것을 의미합니까?

지구상의 어딘가에 옛날 방식으로 '자동'을 사용하는 소량의 코드가 있다고 가정합니다. 그러나 '자동'을 제거하면 문제를 해결할 수 있으며 다시 작동합니다. 따라서 키워드의 용도를 변경하는 것이 분명했습니다.

나는 또한 그것이 더 명확한 의미라고 생각합니다. 변형 등 var을 사용하여 작업 한 경우 키보드의 모든 키를 직접 눌러 변수 유형을 지정하는 것보다 선언의 형식이 덜 강하다고 생각할 수 있습니다. 나에게,auto 에게 컴파일러가 유형을 자동으로 추론하도록 요청하는 것이 더 명확합니다.이 유형은 직접 지정한 것처럼 강합니다. 따라서위원회에서 좋은 이름을 사용할 수있게 된 것은 정말 행운의 시간이었습니다.

(작은) 구분을 명확히하려면 :

당신이 있었다면

auto int i=0;

C ++ 11 컴파일러로 컴파일하려고하면 다음과 같은 오류가 발생합니다.

오류 C3530 : 'auto'를 다른 유형 지정자와 결합 할 수 없습니다

이것은 사소한 일이므로 auto 또는 int를 제거하고 다시 컴파일하십시오.

그래도 더 큰 문제가 있습니다. 당신이 있었다면

auto i = 4.3;

C와 정말 오래된 C + +를 만들 것 (중단 한 경우는 마찬가지로 - 디폴트 선언했다 ). 이 코드를 컴파일하지 않고 오랜 시간을 보냈거나 오래된 컴파일러를 사용하고 있다면 적어도 이론적 으로이 코드 중 일부를 가질 수 있습니다. C ++ 11은 4.3이 된 이후로 만들 것 입니다. (또는 어쩌면 나는 여전히 박싱 데이 모드에 있지만 요점은 아닙니다 .) 이것은 앱 전체에 미묘한 버그를 일으킬 수 있습니다. 그리고 컴파일러의 경고 또는 오류가 없습니다. 이 보트에있는 사람들은 C ++ 11 컴파일러로 이동하기 전에 구식으로 사용하지 않았는지 확인하기 위해 globablly를 검색해야합니다 . 운 좋게도 그러한 코드는 매우 드 rare니다.iintautointdoublefloatintauto


매우 명확한 답변을 주셔서 감사합니다. +1 이전 버전과의 호환성을 대체로 무해한 방식으로 변경하고 이전 키워드가 새 키워드에 의해 손상되지 않을 가능성이 크다는 점을 이해합니다.
Giorgio

실제로 비 호환성이 있습니까? C ++ 11 컴파일러 auto는 타입 이름 뒤에 if를 무시 하지 않습니까?
aaaaaaaaaaaa

1
Visual C ++ 2012는 error C3530: 'auto' cannot be combined with any other type-specifier그 라인을 말합니다
Kate Gregory

3
@KateGregory : 실제로 auto i = 4.3;C ++ 03 / C ++ 98에서는 형식이 잘못 되었기 때문에 문제가 없습니다 . C ++은 C89가 가진 '암시 적 int'규칙을 따르지 않았습니다 (C99 개정판에서 제외).
Bart van Ingen Schenau

1
@ 케이트 그레고리 : 바트의 관찰을 고려하고 그에 따라 답변을 변경할 수 있다면 허용되는 답변으로 표시합니다.
Giorgio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.