2013-07-30 2 views
0

안녕하세요. C에서 C++로 전환 중입니다. http://www.gotw.ca/publications/xc++.htm을 읽는 동안이 코드 블록을 읽었습니다.이상한 코드 ... 누군가가 내게 이것을 설명 할 수 있습니까?

const int i = 1; 
const int j = 2; 
struct x 
{ 
    int x; 
}; 
namespace y 
{ 
    int i[i]; 
    int j = j; 
    x x; 
    int y::y = x.x; 
}; 

그리고 특별히 namespace y 섹션에서 완전히 혼란 스럽습니다. 이 코드의 동작과 네임 스페이스의 사용법을 설명해주십시오. 또한 어딘가에서 네임 스페이스를 잘못 사용하면 기본 사항 인 inheritance을 위반하게됩니다. 네임 스페이스를 훌륭하게 사용하는 몇 가지 예를 들어주십시오.

+2

이 코드는 컴파일도 있습니까? – leppie

+0

@leppie. 나는 모르겠다. 책에서 그들은 그것을 쓴 것과 같이 이것을 작동 예제로 표시했습니다 ... – someone

+0

간체,'namespace y'는 "내 중괄호 안에 들어있는 모든 것들은 컴파일러에 의해 발견되기 위해'y ::'접두사가 필요합니다." 'x :: x'는'y :: x'와 같지 않으며 네임 스페이스가 없으면'x'라고 명명됩니다. –

답변

1

이 예제는 이름 범위에 대한 요점을 설명하기 위해 끔찍한 코드를 사용하고 있습니다. C++ 11 §3.3.6 [basic.scope.namespace] p1 :

... 네임 스페이스 멤버 이름에는 네임 스페이스 범위가 있습니다. 잠재적 범위 선언의

점에서 §3.3.2 [basic.scope.pdecl] P1 정의 이후 선언 (3.3.2)의 이름의 관점에서 그 공간을 ... 포함

이름에 대한 선언

점은 아래 언급 된 경우를 제외하고는 완벽한 선언자 (8 조)의 후 초기화 (있는 경우) 직전이다.

예를 들어, 내부 범위에있는 i이라는 이름의 초기화 프로그램에서 외부 범위의 이름 i 문제의 코드 :

const int i = 1; 
const int j = 2; 
struct x 
{ 
    int x; 
}; 

namespace y 
{ 
    int i[i]; 
    int j = j; 
    x x; 
    int y::y = x.x; 
} 

선언 :

  • y::i을 암시 제로됩니다 1 int의 배열로 (모든 정적 저장 기간 객체이기 때문에 그들은 더 명시 적으로 초기화가없는 경우 제로 초기화) 초기 값 2와 같은 int
  • y::j, impli 것이다 ::x 형의 구조체로서
  • y::x citly zeroed이고
  • y::y은 잘못된 이름입니다.단순히 y이라면, int이고 초기 값은 y::x.x이 암시 적으로 0으로 초기화되었으므로 초기 값은 0입니다.

Here's a demo (with y::y changed to y) at Coliru.

참고는 : EVER CODE LIKE THIS를 작성하지 마십시오. 이 이름 기능을 사용하는 유일한 방법은 클래스 생성자의 멤버 이니셜 라이저를 사용하는 것입니다. 다른 곳에서는 그렇게한다면, 나는 당신을 찾을 것입니다. 그리고 너를 지불하게 할거야.

0

코드에 문제가 있다고 생각합니다. int y :: y = x.x; 섹션이 잘못 되었기 때문에이 문장은 약간의 수정이 필요합니다. 네임 스페이스와 그 사용법에 대한 몇 가지 기본 정보를 제공하려고합니다. 도움이되기를 바랍니다. 네임 스페이스의 주요 목적은 긴 이름 및 "사용"을 통한 간편한 사용을위한 옵션없이 논리적으로 기능을 그룹화하는 것입니다. 또한 서로 다른 네임 스페이스를 통해 같은 이름을 사용할 수 있습니다

namespace Color 
{ 
    class Add {}; 
    class Multiply {}; 
}; 

namespace Dimension 
{ 
    class Add {}; 
    class Multiply {}; 
}; 

그래서 당신은 동일한 클래스 이름이 네임 스페이스와 당신이 기억해야 할 한 가지에서, 곱하기 추가, 그렇지 않으면 필요한 때 사용하는 네임 스페이스는 당신이 스팸 것입니다 사용할 수 있습니다 글로벌 네임 스페이스 "std"는 잘 모르는 사이에 일반적인 것이 아닙니다.

상속이있는 네임 스페이스를 사용하면 스택 오버 플로우에서 기사를 검색 할 수 있으며 확실히 일부를 얻을 수 있습니다. 예 : Accessing Parent Namespace in C++

+0

이 질문은 "왜이 코드는 네임 스페이스를 사용하고 무엇을 위해"대신 "네임 스페이스와 그 용도가 무엇인가"라는 것을 이해했을 것입니다. – nijansen

0
int i[i]; //line 1 

은 내가 상수 1

int j = j; //line 2 

그것은 선언에 초기화되는 지표로서, 크기 1 int 배열을 생성하고, 2 (상수 J의 값)에 변수 J를 initilizes 그것은 형 구조체 X (의 x 구조 변수를 생성

x x; //line 3 

스페이스 Y는 주 : 구조체 변수 X는 상기 구조 (X) 내부에 존재하는 INT (X)와 다른 INT X struc의 구성원 진짜야 X

int y::y = x.x; //line 4 

이 구문이 잘못, 거기는 namespaace y를에 이미 존재하는 한, 네임 스페이스 ('Y')와 Y INT 자격을 할 필요가 없다, 그래서 문이 있어야한다

int y = x.x 

XX는 3


네임 스페이스 예를이 예에서 살펴보고, 당신이 이해하는 데 도움 데이터 멤버 라인에서 만든 구조 변수 x의 (INT의 X)에 액세스 나타냅니다 네임 스페이스가 분명합니다. 더 많은 예제에 대한 링크를 참조하십시오 [링크] http://www.cplusplus.com/doc/tutorial/namespaces/

#include <iostream> 
using namespace std; 

namespace first 
{ 
    int x = 5; 
    int y = 10; 
} 

namespace second 
{ 
    double x = 3.1416; 
    double y = 2.7183; 
} 

int main() { 
    using namespace first; 
    cout << x << endl; 
    cout << y << endl; 
    cout << second::x << endl; 
    cout << second::y << endl; 
    return 0; 
} 

// 출력 5
10
3.1416
2.7183

  ......Hope it helps you....:) 
관련 문제