'std :;'는 무엇입니까? C ++에서합니까?


89

최근에 일부 코드를 수정하고 함수 내 한 줄에서 기존 버그를 발견했습니다.

std:;string x = y;

이 코드는 여전히 컴파일되고 예상대로 작동합니다.

이 파일이 있기 때문에 문자열 정의 작동 using namespace std;(가) 때문에, std::처음부터 필요했다.

문제는 왜 std:;컴파일이되며 무엇을하고 있는가입니다.


1
@Xeo : 그는 그가 가지고있는 질문에서 말했다 using namespace std;.
Fred Larson

@ 프레드 : Derp! 그 부분은 코드로 표시되지 않았기 때문에 간과했습니다. :) 나는 여전히이 질문 을 지적하고 싶습니다 .
Xeo

23
http://www.stackoverflow.com컴파일 하는 동일한 이유 ...
Kerrek SB

20
사용하지 않는 또 다른 이유 using namespace std;:)
David Rodríguez-dribeas

@KerrekSB reddit을 검색하는 동안 내 친구에게 일어난 일입니다! 링크는 것으로 판명 D :
mmirzadeh

답변:


90

std:의 대상으로 사용할 수있는 레이블입니다 goto.

@Adam Rosenfield 가 주석에서 지적했듯이 법적 레이블 이름입니다.

C ++ 03 §6.1 / 1 :

레이블에는 고유 한 이름 공간이 있으며 다른 식별자를 방해하지 않습니다.


4
AFAIK 레이블에는 고유 한 이름 공간이 있으므로 물론 키워드 나 매크로 이외의 다른 것과 충돌하지 않습니다.
rodrigo

11
C ++ 03 §6.1 / 1은 "라벨은 고유 한 이름 공간을 가지며 다른 식별자를 방해하지 않습니다."라고 말합니다.
Adam Rosenfield

6.1 / 1 : "라벨은 고유 한 이름 공간을 가지며 다른 식별자를 방해하지 않습니다."
John



8
(expression)std: (end of expression); (another expression)string x = y;

4
문법적으로는 실제로 (label-)statementexpression.
GManNickG

1

컴파일러는 무슨 일이 일어나고 있는지 알려줍니다.

#include <iostream>
using namespace std;
int main() {
  std:;cout << "Hello!" << std::endl;
}

gcc와 clang은 모두 매우 명확한 경고를 제공합니다.

std.cpp:4:3: warning: unused label 'std' [-Wunused-label]
  std:;cout << "Hello!" << std::endl;
  ^~~~
1 warning generated.

이 이야기에서 벗어나십시오. 항상 경고를 활성화하여 코드를 컴파일하십시오 (예 :)-Wall .

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