C auto 키워드는 어디에 사용됩니까?


104

대학 시절에 나는 auto키워드 에 대해 읽었고 시간이 지남에 따라 실제로 그것이 무엇인지 잊어 버렸습니다. 다음과 같이 정의됩니다.

지역 변수를 지역 수명을 갖는 것으로 정의

나는 그것이 어디에서 사용되는 것을 결코 발견하지 못했습니다. 실제로 사용됩니까? 그렇다면 어디에 사용되며 어떤 경우에 사용됩니까?

답변:


90

auto같은 수정 자 static입니다. 변수의 스토리지 클래스를 정의합니다. 그러나 지역 변수의 기본값은 auto이므로 일반적으로 수동으로 지정할 필요가 없습니다.

이 페이지 에는 C의 다양한 스토리지 클래스가 나열됩니다.


13
누군가가 내 대답에 찬성 투표를 한 후에 이것을 다시보고있었습니다. "일반적으로 수동으로 지정할 필요가 없습니다."라고 말합니다. 있는 상황 실제로이 : 난 그냥 물어 봐야 auto 를 지정할 수는 있지만 기본적으로 일어나지 않을 것입니다?
Jerry Coffin 2013 년

2
@JerryCoffin Not in C. C ++ 11에서는 용도가 변경되었으며 로컬 변수 유형 추론을 효과적으로 얻는 데 사용할 수 있습니다.
메흐 다드 Afshari

2
한 가지 가능한 사용은 GNU C에서 중첩 된 함수의 정방향 선언입니다 auto. 이것은 원래 정의의 . tigcc.ticalc.org/doc/keywords.html#auto
요시야

2
링크 된 페이지가 오래되었습니다. C11 이후 _Thread_local세부 정보도 있습니다. en.cppreference.com/w/c/language/storage_durationstackoverflow.com/a/14289720/6557621
MCCCS

132

IAQ (Infrequently Asked Questions) 목록을 읽으면 자동차가 주로 차량을 정의하거나 신고하는 데 유용하다는 것을 알 수 있습니다.

auto my_car;

지속적으로 실외에 주차 된 차량 :

extern auto my_car;

유머 감각이 부족하고 "사실 만"을 원하는 사람들을위한 짧은 대답은 사용할 이유가 전혀 없다는 auto것입니다. 사용할 수있는 유일한 시간은 auto이미 auto저장소 클래스 가있는 변수 를 사용 하는 것이므로 어쨌든 일어날 일을 지정하는 것입니다. 스토리지 클래스가 아직 auto없는 변수 에서 사용하려고 auto하면 컴파일러에서 코드를 거부합니다. 기술을 얻고 싶다면 구현이 컴파일러 일 필요는없고 (하지만 그렇습니다) 이론적으로 진단을 내린 후 코드를 계속 컴파일 할 수 있습니다 (하지만 그렇지 않습니다).

kaz의 작은 부록 :

도 있습니다:

static auto my_car;

ISO C에 따른 진단이 필요합니다. 이는 자동차가 고장 났다고 선언하기 때문에 정확합니다. 진단은 무료이지만 대시 보드 조명을 끄면 80 달러가 든다. (eBay에서 온보드 진단용 USB 동글을 구입 한 경우 20 개 이하).

앞서 언급 한 것 extern auto my_car역시 진단이 필요하기 때문에 주차 단속을 담당하는시 직원 외에는 컴파일러를 통해 실행되지 않습니다.

extern static auto ...코드베이스에서 많은 것을 본다면 당신은 나쁜 이웃에있는 것입니다. 전체 장소가 Rust로 바뀌기 전에 즉시 더 나은 직업을 찾으십시오.


@self .: ISO는 "ISO 2011"을 알지 못하는 것 같습니다. 그것이 무엇을 표준화 할 것이라고 생각하십니까?
Jerry Coffin

6
입에 커피, 콜라, 스타우트 또는 다른 짙은 색의 액체가 없었습니다. 당신은 컴퓨터 화면 @JerryCoffin을 빚지고 있습니다. 이제까지 최고의 답변!
David Hammen

2
@Dan : 솔직히 5 줄의 텍스트를 읽고 "자동을 사용할 이유가 전혀 없다는 것이 짧은 대답"이라는 부분을 얻는 데 "아주 오래"걸렸습니다. 정말? 귀하의 의견 바로 앞의 의견을 감안할 때 적어도 소수의 사람들이 긍정적 인 기여를 한 것으로 보입니다.
Jerry Coffin

@JerryCoffin 나는 이미 그것을 설명했고, 내 의견을 다시 읽으십시오. Hindsight는 20/20입니다.
Dan Bechard 2017 년

2
나는 최근에 필요성을 제안합니다 (두 개의 차선을 폐쇄) 심각한 화재 통과char auto my_car;
스탁

46

auto키워드는 C 언어에서 쓸모가 없다. C 언어 이전에는 해당 키워드가 지역 변수를 선언하는 데 필요한 B 언어가 있었기 때문입니다. (B는 NB로 개발되어 C가되었습니다).

다음은 B에 대한 참조 설명서입니다 .

보시다시피 매뉴얼 auto에는 사용되는 예제가 가득 합니다. int키워드 가 없기 때문입니다 . "이것은 변수의 선언입니다"라고 말하려면 어떤 종류의 키워드가 필요하며 해당 키워드는 로컬인지 외부인지 ( autoextrn) 도 나타냅니다 . 둘 중 하나를 사용하지 않으면 구문 오류가 발생합니다. 즉 x, y;, 선언 자체가 아니라 auto x, y;있습니다.

B로 작성된 코드베이스는 언어가 개발됨에 따라 NB와 C로 포팅되어야했기 때문에 최신 버전의 언어는 이전 버전과의 호환성을 개선하기 위해 약간의 짐을 싣고 작업량이 줄어 들었습니다. 의 경우 auto프로그래머는 모든 항목을 찾아서 auto제거 할 필요가 없습니다.

매뉴얼에서 C ( 앞에 아무것도 쓰지 main() { ... }않고 쓸 수있게 됨)의 "암묵적 int"부분 int이 B에서도 나왔다는 것이 분명합니다 . 이것은 B 코드를 지원하는 또 다른 하위 호환성 기능입니다. 유형이 없기 때문에 함수에는 B에 지정된 반환 유형이 없습니다. 많은 어셈블리 언어에서와 같이 모든 것이 단어입니다.

함수를 선언 할 수있는 방법 extrn putchar과 식별자가 사용 하는 함수로 만드는 유일한 방법에 유의하십시오 . 함수 호출 표현식에서 사용됩니다. putchar(x)즉, 컴파일러에게 유형없는 단어를 함수 포인터로 처리하도록 지시하는 것입니다.


24

C auto에서 변수가 블록에 로컬임을 나타내는 키워드입니다. 이것이 블록 범위 변수의 기본값이기 때문에 불필요하고 거의 사용되지 않습니다 (키워드를 논의하는 텍스트에서 예제 외부에서 사용하는 것을 본 적이 없다고 생각합니다). 누군가가 auto올바른 구문 분석 또는 동작을 얻기 위해 사용 이 필요한 경우를 지적 할 수 있다면 관심이있을 것 입니다.

그러나 C ++ 11 표준에서는 auto유형 추론을 지원하기 위해 키워드가 '하이재킹'되었습니다. 여기서 변수 유형은 초기화 프로그램 유형에서 가져올 수 있습니다.

auto someVariable = 1.5;   // someVariable will have type double

유형 추론은 주로 템플릿에서 변수 선언을 지원하기 위해 추가되거나 템플릿 매개 변수를 기반으로하는 유형 (또는 템플릿이 인스턴스화 될 때 컴파일러에 의해 추론 됨)이 수동으로 선언하는 것이 매우 어려울 수있는 템플릿 함수에서 반환됩니다.


1
"변수는 블록에 대해 로컬입니다"-전혀 사실이 아닙니다. 블록에 선언 된 모든 변수는 해당 블록에 로컬입니다 (범위와 관련하여). 프로그램의 다른 변수에 링크 될 수 있지만 선언은 해당 블록에서만 볼 수 있습니다. auto가시성과 관련이없는 스토리지 클래스에 관한 것입니다.
fuz

12

이전 Aztec C 컴파일러에서는 명령 줄 스위치를 사용하여 모든 자동 변수를 정적 변수 (어드레싱 속도 향상)로 전환 할 수있었습니다.

그러나로 명시 적으로 선언 된 변수 auto는이 경우 그대로 남아 있습니다. (그렇지 않으면 제대로 작동하지 않는 재귀 함수의 필수 요소입니다!)


7

auto키워드는 Python에 세미콜론을 포함하는 것과 유사하며 이전 언어 ( B) 에서 필요 했지만 개발자는 대부분이 auto.

B에서 C 로의 전환을 돕기 위해 남겨진 것 같습니다. 간단히 말해 B 언어 호환성을위한 용도입니다.

예를 들어 B와 80 년대 C :

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extrn putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}

1

Auto 키워드는 스토리지 클래스 (변수 및 스토리지 장소의 수명을 결정하는 일종의 기술) 예제입니다. 해당 키워드의 Help에 의해 만들어진 변수가 중괄호 안에 만 수명 (lifetime)이 존재하는 동작이 있습니다.

{
    auto int x=8;        
    printf("%d",x);  // here x is 8

    { 
        auto int x=3;
        printf("%d",x);  // here x is 3
    }              

    printf("%d",x);  // here x is 8
}          

0

auto블록 범위 변수에만 사용할 수 있습니다. extern auto int컴파일러가 이것이 외부 정의를 사용하는지 또는 자동 정의로 extern을 재정의할지 여부를 결정할 수 없기 때문에 쓰레기입니다 (또한 auto와 extern은 완전히 다른 저장 기간 static auto int입니다. 항상 한 방향으로 해석하도록 선택할 수 있지만 대신 오류로 처리하도록 선택합니다.

auto제공하는 기능이 하나 있으며 함수 내에서 '모든 것이 정수입니다'규칙을 활성화하는 것입니다. 할당이 파일 범위에 존재하지 않기 때문에 a=3는 정의로 해석 되는 함수 외부와 달리 컴파일러가 항상 정의가 아닌 외부 변수에 대한 할당으로 해석하기 때문에 함수 내부에 오류가 있습니다. 전혀없는 파일 범위 함수 또는 앞으로 선언)하지만, 같은 지정자 , , 또는 가 정의되고 제외 컴파일러가 정의로 소요 함축 다른 지정자의 부작용이없는이. 따라서 암시 적으로 . 물론입니다.int a =3a=3extern int astaticconstvolatileautoautoauto a=3auto int a = 3signed a = 3동일한 효과를 가지며 unsigned a = 3항상 unsigned int입니다.

또한 ' auto는 객체가 레지스터에 할당되는지 여부에 영향을 미치지 않습니다 (특정 컴파일러가주의를 기울이지 않는 한, 가능성이없는 것 같습니다)'


-1

"extern", "static", "register"및 "auto"인 C의 스토리지 클래스 지정자에 대해 잘 알고 계실 것입니다. "auto"의 정의는 다른 답변에 거의 나와 있지만 확실하지 않은 "auto"키워드의 가능한 사용법이 있지만 컴파일러에 따라 다릅니다. 스토리지 클래스 지정자와 관련하여 규칙이 있습니다. 변수에 대해 여러 저장소 클래스 지정자를 사용할 수 없습니다. 그렇기 때문에 정적 전역 변수를 외부로 사용할 수 없습니다. 따라서 그들은 자신의 파일에만 알려져 있습니다. 컴파일러 설정으로 이동하면 속도 최적화 플래그를 활성화 할 수 있습니다. 컴파일러가 최적화하는 방법 중 하나는 스토리지 클래스 지정자가없는 변수를 찾은 다음 캐시 메모리의 가용성 및 기타 요인을 기반으로 평가하여 레지스터 지정자를 사용하여 해당 변수를 처리해야하는지 여부를 확인합니다. 이제 우리 프로그램의 특정 변수가 그다지 중요하지 않으며 컴파일러가 그것을 레지스터로 간주하지 않기를 바라면서 속도를 위해 코드를 최적화하려면 어떻게해야할까요? auto를 입력하면 컴파일러가 "register auto int a;"를 입력하기 때문에 변수에 레지스터 지정자를 추가 할 수 없습니다. 또는 "자동 등록 int a;" 여러 스토리지 클래스 지정자를 사용하면 오류가 발생합니다. 요약하자면 auto는 컴파일러가 최적화를 통해 변수를 레지스터로 처리하는 것을 금지 할 수 있다고 생각했습니다. 프로그램의 특정 변수가 그다지 중요하지 않다는 것을 알면서도 속도를 위해 코드를 최적화하고 컴파일러가이를 레지스터로 간주하는 것을 원하지 않는다면 어떨까요? auto를 입력하면 컴파일러가 "register auto int a;"를 입력하기 때문에 변수에 레지스터 지정자를 추가 할 수 없습니다. 또는 "자동 등록 int a;" 여러 스토리지 클래스 지정자를 사용하면 오류가 발생합니다. 요약하자면 auto는 컴파일러가 최적화를 통해 변수를 레지스터로 처리하는 것을 금지 할 수 있다고 생각했습니다. 프로그램의 특정 변수가 그다지 중요하지 않다는 것을 알면서도 속도를 위해 코드를 최적화하고 컴파일러가이를 레지스터로 간주하는 것을 원하지 않는다면 어떨까요? auto를 입력하면 컴파일러가 "register auto int a;"를 입력하기 때문에 변수에 레지스터 지정자를 추가 할 수 없습니다. 또는 "자동 등록 int a;" 여러 스토리지 클래스 지정자를 사용하면 오류가 발생합니다. 요약하자면 auto는 컴파일러가 최적화를 통해 변수를 레지스터로 처리하는 것을 금지 할 수 있다고 생각했습니다. 여러 스토리지 클래스 지정자를 사용하면 오류가 발생합니다. 요약하자면 auto는 컴파일러가 최적화를 통해 변수를 레지스터로 처리하는 것을 금지 할 수 있다고 생각했습니다. 여러 스토리지 클래스 지정자를 사용하면 오류가 발생합니다. 요약하자면 auto는 컴파일러가 최적화를 통해 변수를 레지스터로 처리하는 것을 금지 할 수 있다고 생각했습니다.

이 이론은 GCC 컴파일러에서는 작동하지 않았지만 다른 컴파일러는 시도하지 않았습니다.

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