2013-04-30 2 views
0

나는 그런 예쁜 코드를 가지고 :왜 컴파일러는 모호한 변수 정의를 허용합니까?

물론
//example1 
namespace 
{ 
    int a; 
} 

int a; 

main() 
{ 
    a++; 
    return 0; 
} 

, g ++ 4.6.1 컴파일러는 컴파일 에러 출력 할 수 없습니다 그것은 모든 권리

./temp.cpp: In function ‘int main()’: 
./temp.cpp:10:5: error: reference to ‘a’ is ambiguous 
./temp.cpp:6:5: error: candidates are: int a 
./temp.cpp:2:9: error:     int {anonymous}::a 

을! 내가 변수 "" "주요"기능에서을에 대한 참조를 삭제할 때

하지만, 프로그램이 잘 컴파일되고 :

//example2 
namespace 
{ 
    int a; 
} 

int a; 

main() 
{ 
    return 0; 
} 

1) g ++ 컴파일러의 정의를 허용 않는 이유 변수 ""과 같은 경우 해당 참조가 허용되지 않는 경우?

2) g ++ 컴파일러의 기능 뿐이며 다른 컴파일러는 이러한 코드 (example2)를 컴파일 할 수 없습니까?

3) g ++ 컴파일러는 해당 코드 (예 2)를 오류로 해석하는 해당 플래그가 있습니까?

모두에게 감사드립니다.

답변

4

두 번째 예도 해당 번역 단위 외부에서 a 전역에 계속 액세스 할 수 있기 때문에 유효합니다.

익명 네임 스페이스의 a은 내부 연결이있는 변수에 대한 정의를 제공합니다. 전역 네임 스페이스 범위에있는 a은 외부 연결이있는 변수의 정의입니다. 다른 번역 단위로 extern int a;을 선언하고 사용할 수 있습니다.

+0

정말! :) 나는 그런 변수의 "a"사용법에서 소스 코드의 끝에 놓여 야한다고 생각한다. –

+2

가장 좋은 위치에 놓아야한다 ... –

1

짧은 답변은 "불법적 인 내용이 없기 때문에"입니다. 주로 a을 잘못 사용하면됩니다. ::a을 사용하는 경우 네임 스페이스가없는 전역 경로를 제공합니다.

a을 네임 스페이스 자체 내에 사용할 수 있습니다 (예 : 당신이 코드가 유효 의미하지 않는다 main에서 익명 네임 스페이스의 a을 참조 할 수 없습니다해서

namespace { 
    int a; 

    int work_with_a() 
    { 
     a += 2; 
     return a; 
    } 

} 


int a; 

int main() 
{ 
    ::a++; 

    int b = work_with_a(); 

    cout << ::a + b; 
} 
+0

"a" 익명 네임 스페이스의 변수? 가능한가? –

+1

나는 두 가지를 모두 메인에서 어떻게 사용할 수 있는지 명확히하기 위해 편집했습니다. –

1

: 우리는 기능을 가질 수있다.

익명 네임 스페이스의 a은 여전히 ​​익명 네임 스페이스에서 참조 할 수 있습니다.

세계 각국에서 a을 참조 할 수 있습니다 (모호성을 제거하려면 main::a을 사용해야합니다).

관련 문제