C 및 C++의 정적 및 외부 글로벌 변수
저는 두 개의 프로젝트를 만들었는데, 첫 번째 프로젝트는 C에서, 두 번째 프로젝트는 C++에서 모두 같은 동작으로 작동합니다.
C 프로젝트:
머리글.h
int varGlobal=7;
주.c.
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
void function(int i)
{
static int a=0;
a++;
int t=i;
i=varGlobal;
varGlobal=t;
printf("Call #%d:\ni=%d\nvarGlobal=%d\n\n",a,i,varGlobal,t);
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
C++ 프로젝트:
머리글.h
int varGlobal=7;
main.cpp
#include <iostream>
#include "header.h"
using namespace std;
void function(int i)
{
static int a=0;
int t=i;
a++;
i=varGlobal;
varGlobal=t;
cout<<"Call #"<<a<<":"<<endl<<"i="<<i<<endl<<"varGlobal="<<varGlobal<<endl<<endl;
}
int main() {
function(4);
function(6);
function(12);
return 0;
}
글로벌 변수는 기본적으로 외부 변수이고 C에서는 기본적으로 정적 변수이며 C++에서는 기본적으로 정적 변수라고 읽었습니다. 그렇다면 C++ 코드가 작동하는 이유는 무엇입니까?
즉, int varGlobal=7은 static int varGlobal=7과 동일합니다. 정적인 경우 선언된 파일에서만 사용할 수 있습니다. 그렇죠?
전역 변수는 다음과 같습니다.extern
도 아니다static
기본적으로 C 및 C++에 있습니다.변수를 다음과 같이 선언할 때static
현재 원본 파일로 제한하고 있습니다.다음과 같이 선언할 경우extern
당신은 변수가 존재하지만 다른 곳에 정의되어 있고, 만약 당신이 다른 곳에 정의되어 있지 않다면 (그 없이)extern
키워드) 링크 오류가 발생합니다(키워드를 찾을 수 없음).
해당 헤더를 포함한 소스 파일이 더 많을 때 코드가 끊어집니다. 링크 시간에 여러 개의 참조가 있을 것입니다.varGlobal
다음과 같이 선언할 경우static
그러면 여러 소스(즉, 컴파일 및 링크)와 함께 작동하지만 각 소스는 고유합니다.varGlobal
.
C에서 할 수 없는 C++에서 할 수 있는 것은 변수를 다음과 같이 선언하는 것입니다.const
헤더에 다음과 같이 표시됩니다.
const int varGlobal = 7;
그리고 링크 시간에 무언가를 깨트리지 않고 여러 소스에 포함시킵니다.그 아이디어는 오래된 C 스타일을 대체하는 것입니다.#define
상수에 대해
여러 소스에 표시되는 전역 변수가 필요하고 표시되지 않는 경우const
라고 선언합니다.extern
헤더에서 다음과 같이 정의합니다. 이때 extern 키워드를 사용하지 않고 소스 파일에서:
여러 파일에 포함된 헤더:
extern int varGlobal;
원본 파일 중 하나:
int varGlobal = 7;
당신이#include
헤더는 마치 소스 파일 자체에 코드를 넣는 것과 같습니다.두 경우 모두에서varGlobal
변수는 소스에 정의되므로 어떻게 선언하든 작동합니다.
또한 코멘트에서 지적한 바와 같이 파일 범위의 C++ 변수는 정적 스토리지에 할당되더라도 범위에서 정적이지 않습니다.예를 들어 변수가 클래스 멤버인 경우 기본적으로 프로그램의 다른 컴파일 장치에서 액세스할 수 있어야 하며 클래스가 아닌 멤버도 마찬가지입니다.
언급URL : https://stackoverflow.com/questions/11055802/static-and-extern-global-variables-in-c-and-c
'programing' 카테고리의 다른 글
.ts에서 Angular detect If 확인란이 선택되어 있습니다. (0) | 2023.06.12 |
---|---|
OSX에서 설치된 모든 보석을 제거하시겠습니까? (0) | 2023.06.12 |
이 약속이 발신자에게 다시 해결되지 않는 이유는 무엇입니까? (0) | 2023.06.12 |
데이터 프레임에서 행을 삭제하려면 어떻게 해야 합니까? (0) | 2023.06.12 |
'내용'과 '텍스트'의 차이점은 무엇입니까? (0) | 2023.06.12 |