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
'programing' 카테고리의 다른 글
vue 컴포넌트와 앱에서 el과 template의 차이점은 무엇입니까? (0) | 2022.08.16 |
---|---|
Java에서 문자열의 첫 글자를 대문자로 표시하는 방법은 무엇입니까? (0) | 2022.08.16 |
진입점 - webpack.config.js vs vue.config.js (0) | 2022.08.16 |
'더블' 대 '더블' 정밀도 (0) | 2022.08.16 |
nuxt auth 모듈을 사용하여 인증 상태를 검출하기 위해 새로 고침 필요 (0) | 2022.08.16 |