C ++의 정적 전역 및 익명 네임 스페이스


11
  1. C ++에서 정적 전역 (내부 연결)과 명명되지 않은 네임 스페이스의 기호 (외부 연결이지만 외부에서 그것을 참조 할 방법이 없음)를 구별하는 이유는 무엇입니까?

  2. 그 이유 중 하나라도 여전히 유효합니까, 아니면 새로운 이유가 있습니까?

  3. 그들이 여전히 다른 곳에 남아있는 곳이 있지만 익명의 전역 (또는 네임 스페이스 범위) 연합이 해야하는static 임의의 규칙은 무엇입니까?

  4. 보너스 포인트의 경우, 다른 이유가 남아 있지 않다면, 동등한 것으로 만들라는 요청이 있습니까?


C ++에서 네임 스페이스 (C ++ 98), 특히 이름이없는 네임 스페이스를 도입했을 때 정적 전역은 더 이상 사용되지 않고 열성적으로 새로운 것보다 열등하지만 C ++ 11되돌아갔습니다 :
정적 키워드의 Deprecation… 더 이상은 없어?

C ++ 11 이전에는 내부 연계가있는 기호를 템플릿 인수로 사용할 수 없었습니다. 왜 C ++ 03에 외부 연계가 필요한 템플릿 매개 변수가 필요 했습니까?


"적합한 구현"비트를 제외하고는 대부분 자신의 질문에 대답 한 것 같습니다. 아마도 후반부를 제거하고 대신 답변으로 게시하는 것을 고려해야합니까? 아니면 아직 답이없는 것이 있습니까?
Kyle Strand

@KyleStrand 모든 것을 재구성했습니다.
중복 제거기

답변:


3

나는 (? 중 또는)이 당신의 모든 질문에 대답을 생각하지 않지만, 파일 수준의 정적 선언과 익명의 네임 스페이스 사이의 키 차이는 네임 스페이스도 (유형에 적용 당신이 선언 할 수 있다는 것입니다 static의 유형을 변수를 선언하는 것과 같은 의미입니다.) 따라서 네임 스페이스가 선호되므로 파일 범위의 데이터 및 유형을 선언하는 단일 관용구가 있습니다.

예를 들어, 다음 코드는 정상적으로 컴파일되어야합니다. (두 유형을 구분할 수는 없지만 허용되므로 실제로는 유용하지 않습니다)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

여기서 라이브 테스트 .


주 함수에서 Foobar를 사용하지 않기 때문에 컴파일됩니다.
dshil December

더 중요한 것은 다른 .cpp 파일이 자체 버전을 선언하면 어떻게됩니까 struct Foobar? 아직도 더 나쁘다, 지금 있다고 가정하자 class Foobar. 둘 다에 대한 생성자를 만드는 방법에 대해 생각하십시오.
dgnuff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.