문제

이 주제에 대한 답변을 읽었지 만 여전히 확실하지 않습니다 :

C ++에서 전역 const 변수 정의는 자동으로 static입니다. 그러나 extern을 통해 다른 cpp-file에서 액세스 할 수 있습니다.

// module.cpp

const int i = 0;
.

// main.cpp

extern const int i;

int main ()
{
    if (i > 10)
        return 0;
    else
        return 1;
}
.

다른 모듈에서 내부 연결된 객체에 액세스 할 수있는 이유는 무엇입니까? 일반적으로 나는 module.cpp의 iextern const int i = 0를 정의하여 명시 적으로 전역이지만 정적이 아닌 song , 또는?

를 갖도록 강요해야합니다.

비교할 때, 이것은 불가능합니다.

// module.cpp

static int i = 0;
.

// main.cpp

extern int i;

int main ()
{
    i = 10; // but read-only access like (i > 10) would be possible!
    return 0;
}
.

그래서 답변은 다음과 같습니다. 예, 다른 모듈에서 내부 연결된 오브젝트에 액세스 할 수 있지만 읽기 만 가능합니다 (항상 const와 함께)

편집 :

죄송합니다. 그러나 나는 실수를 저질렀습니다. 내 원래 코드에서 나는 효과 (두 예제에서)없이 표현을 시도했다 :

extern const int i; // or extern int i for second example
int main ()
{
    i>10;
    return 0;
}
.

프로그램 흐름이나 데이터 가이 표현에 의존하는 것처럼 작동하는 것처럼 작동합니다. 그러나 실제로는 그렇지 않습니다! 컴파일러는이 효과가없는 표현을 잘라내어 링커가 그것을 보지 못하게하는 것 같습니다! 그래서 모든 것이 괜찮습니다 : 첫 번째 예제에서 i는 실제로 module.cpp에서 extern const int i = 0를 정의해야하며 두 번째 예제에서는 i는 전혀 액세스 할 수 없습니다 (효과적인 표현식이 아닌 경우). 컴파일러는 VC ++ 2010입니다.

edit2 :

그러나 이제는 이것이 가능한 이유를 이해하지 못합니다 :

// module.cpp

extern const int i = 0;
.

// main.cpp

int i = 99;

int main ()
{
    bool b = i>10;
    return 0;
}
.

i에는 외부 링크가 모두 있습니다. 그러나 오류가 없습니다. Module.cpp에서 int i = 0를 정의한 다음 오류 (여러 기호)를 정의합니다. 왜?

도움이 되었습니까?

해결책

나와 같이 컴파일러 버그처럼 보입니다.constant 변수 i는 main.cpp에서만 선언됩니다.Module.cpp의 변수 i는 내부 연결을 가지고 있으며 모듈 외부에 액세스 할 수 없습니다.

원래 게시물에 추가를 기준으로 컴파일러는이 상황과 공통점이 없습니다.중복 된 외부 기호가 있는지 여부를 확인하는 링커입니다.하나의 변수가 한정자 Const가 있고 다른 변수가없는 경우에는 두 가지 변수가 있습니다.링커가 오류가 발생했는지 여부가 정의 된 구현이 정의되었다고 생각합니다.또한 그러한 상황에서 링커의 동작을 제어 할 수있는 몇 가지 옵션이있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top