programing

C/C++ 글로벌과 스태틱 글로벌

bestcode 2022. 8. 16. 23:23
반응형

C/C++ 글로벌과 스태틱 글로벌

중복 가능성:
스태틱과 글로벌

글로벌 변수와 스태틱 글로벌 변수의 차이점에 대해 혼란스럽습니다.static이 이 변수가 같은 파일에 대해서만 글로벌하다는 것을 의미한다면 두 개의 다른 파일에서 동일한 이름이 이름 충돌을 일으키는 이유는 무엇입니까?

누가 설명 좀 해줄래?

글로벌 변수(비활성화)static)를 작성하면,.o링커가 다른 파일에서 사용할 수 있는 파일입니다.따라서 이와 같은 파일이 두 개 있으면 이름 충돌이 발생합니다.a:

교류:

#include <stdio.h>

int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

B.C:

int a;

int compute(void)
{
    a = 0;
    return a;
}

왜냐하면 링커는 어느 쪽이 글로벌한지 모르기 때문입니다.a를 사용합니다.

단, 스태틱글로벌 정의 시 컴파일러는 해당 파일에 대해서만 변수를 유지하고 링커에게는 이 사실을 알리지 않도록 합니다.그래서 만약 당신이 추가한다면static(의 정의상)a내가 쓴 2개의 샘플코드에 대해서 링커는 단순히 링커가 이 코드가 있다는 것조차 모르기 때문에 이름 충돌은 일어나지 않습니다.a다음 파일 중 하나에 있습니다.

교류:

#include <stdio.h>

static int a;

int compute(void);

int main()
{
    a = 1;
    printf("%d %d\n", a, compute());
    return 0;
}

B.C:

static int a;

int compute(void)
{
    a = 0;
    return a;
}

즉, 각 파일은 각각 독자적인 것으로 동작합니다.a다른 놈들에 대해서도 모른 채요


부차적으로, 그들 중 하나가 있어도 괜찮다.static다른 파일에 있는 한 다른 파일도 사용할 수 있습니다.2개의 선언이 같은 파일(읽기 변환 유닛)에 있는 경우, 1개static그리고 하나extern, 이 을 참조해 주세요.

각 파일에 정적인 이름은 이름 충돌을 일으키지 않아야 합니다.이 코드가 표시되는 경우는, 사용하고 있는 정확한 컴파일러와 함께 데모 코드를 투고해 주세요.그러면 코드를 올바르게 검증할 수 있습니다.또, 이 코드가 올바른 경우는, 컴파일러를 비난해 주세요.

FWIW 뿐만이 아니라, C++에서는 어나니머스 네임스페이스를 사용하는 것이 바람직합니다.

namespace { 
    int not_a_static_variable;
}

솔직히 말해서 객관적인 이점을 많이 지적할 수는 없지만...

언급URL : https://stackoverflow.com/questions/7837190/c-c-global-vs-static-global

반응형