2016-08-05 3 views
1

나는 using-declarations에 대해 약간 혼란 스럽다. using foo::bar;은 이라는 네임 스페이스를 현재 네임 스페이스로 가져 오지만 정적 또는 동적으로 발생하는 것으로 알고 있습니다.사용 선언은 정적입니까?

더 구체적으로 사용 선언은 오버 헤드를 유발합니까? 조건에 따라 같은 이름의 다른 기호를 가져올 수 있습니까? (즉, 나쁜 관행 것입니다,하지만 난 궁금 모두 같은)

+5

"심볼 가져 오기"는 개념적 일뿐입니다. 실제로, 네임 스페이스'foo'에 대한'using' 선언은 비 네임 스페이스 한정 기호가'foo'에서 오는 기호를 참조 할 수 있다는 것을 컴파일러에게 알려줍니다. 실행시 오버 헤드는 존재하지 않습니다. 런타임시 기호가 (대부분) 존재하지 않기 때문입니다. 컴파일 타임 오버 헤드가 있는지 여부는 컴파일러에 따라 다릅니다. – KABoissonneault

+0

감사합니다. 실제로 아래 답변보다 훨씬 도움이됩니다. – Eternal

답변

8

네임 스페이스 확인은 컴파일 할 때 발생합니다. 런타임에 동적으로 변경할 수 없습니다.

한 조건에 따라 다른 기호를 가져 오는 방법은 처리기 지시문 및 매크로를 사용하는 것입니다 c++에서

#ifdef USEA 
using a::f; 
#else 
using b::f; 
#endif 
0

사용하여 선언은 어떤처럼 보이는 ... 그것은 고정해야하지만, 나는 이것을 확인하기 위해 아무것도 찾을 수 없습니다처럼

느낀다 다른 선언들. 그것은 쓰여지는 곳에 따라 자체 범위를 가지고 있습니다. 변수를 동적으로 선언 할 수 없습니다.

+4

나는 OP가 "파일 범위"에서처럼 "정적"에 대해 이야기하고 있다고 생각하지 않습니다. 나는 그것이 정적 대 동적 (즉 : 컴파일 타임 대 런타임)에 대해 더 많은 것이라고 생각한다. – KABoissonneault

+0

@KABoissonneault 왜 정적 저장 기간에 대해 말하고있는 걸 결정 했는가? –

+4

범위의 개념이이 대답과 관련이 없다고 생각합니다. 증거로서, 당신의 대답이 암시하고있는 것이 무엇인지 혼란 스러웠습니다. – KABoissonneault

2

using이를 컴파일러가 컴파일

동안 이름을 확인하는 방법을 지시는, 즉에만 영향을 컴파일 시간

조건에 따라 같은 이름의 다른 기호를 가져올 수 있습니까?

당신이 말하는 조건에 달려 있습니다. 프리 프로세서의 조건이 #ifdef 인 경우 가능합니다. 런타임 조건을 생각하면 아니요, using은 런타임에 수행되지 않습니다.