스택큐힙리스트

C와 C++에서의 정적 및 외부 전역 변수 본문

카테고리 없음

C와 C++에서의 정적 및 외부 전역 변수

스택큐힙리스트 2023. 11. 19. 21:58
반응형

나는 2개의 프로젝트를 만들었고, 첫 번째는 C로 작성되었으며 두 번째는 C++로 작성되었다. 두 프로젝트 모두 동일한 동작을 한다.


C 프로젝트:


header.h


int varGlobal=7;

main.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(호출 #%d:\ni=%d\nvarGlobal=%d\n\n,a,i,varGlobal,t);
}
int main() {
function(4);
function(6);
function(12);
return 0;
}

C++ 프로젝트:


header.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<<호출 #<<a<<:<<endl<<i=<<i<<endl<<varGlobal=<<varGlobal<<endl<<endl;
}
int main() {
function(4);
function(6);
function(12);
return 0;
}

전역 변수는 기본적으로 extern이며 C에서는 기본적으로 static입니다. 그러므로 C++ 코드가 작동하는 이유는 무엇인가요?


즉, int varGlobal=7;static int varGlobal=7;과 같으며, static 변수는 해당 파일에서만 사용할 수 있다는 것이 맞나요?

답변 1

전역 변수는 기본적으로 C와 C++에서 extern이나 static으로 선언되지 않습니다.
변수를 static으로 선언하면 현재 소스 파일에 제한됩니다. extern으로 선언하면 변수가 존재하지만 다른 곳에서 정의되었음을 의미하며, 다른 곳에서 정의되어 있지 않은 경우 (extern 키워드 없이) 링크 에러 (심볼을 찾을 수 없음)가 발생합니다.


해당 헤더를 포함한 여러 개의 소스 파일이 있는 경우 코드가 깨지게 됩니다. 링크 시간에 varGlobal에 대한 여러 참조가 생기기 때문입니다. static으로 선언하면 여러 개의 소스 파일과 함께 동작하지만, 각 소스는 자체 varGlobal을 갖게 됩니다.


C++에서만 가능한 것은 헤더에서 변수를 const로 선언하는 것입니다. 아래와 같이:


const int varGlobal = 7;

그리고 링크 시간에 문제없이 여러 소스에 포함하십시오. 상수를 위해 이전의 C 스타일 #define을 대체하는 것이 아이디어입니다.


여러 소스에서 보이는 전역 변수가 필요하고 const가 아닐 경우, 헤더에 extern으로 선언한 다음 소스 파일에서 extern 키워드 없이 정의하십시오:


여러 파일에서 포함된 헤더:


extern int varGlobal;

소스 파일 중 하나에서:


int varGlobal = 7;

답변 2

C 및 C++에서의 static과 extern 전역 변수
C 및 C++는 다양한 프로그래밍 언어 중 가장 많이 사용되는 언어 중 하나입니다. 이들 언어에서 전역 변수는 프로그램의 여러 부분에서 접근할 수 있는 변수입니다. 전역 변수는 애플리케이션의 전체 범위에서 공유되는 데이터를 저장하는 데 사용됩니다. C 및 C++에서는 static 및 extern 예약어를 사용하여 전역 변수의 특성을 정의할 수 있습니다.
1. static 전역 변수
static 키워드는 C 및 C++에서 전역 변수의 지역화(localization)를 의미합니다. static 전역 변수는 선언된 파일에서만 접근 가능하며, 다른 파일에서는 접근할 수 없습니다. 이는 전역 변수의 범위를 제한하여 변수 충돌 문제를 방지합니다. static 전역 변수는 선언 시 초기화되며, 초기 값은 프로그램 실행 중에 변하지 않습니다. 함수 내부에서도 static 지역 변수를 사용할 수 있습니다. static 전역 변수는 다른 파일에서 동일한 이름을 가진 전역 변수와 충돌하지 않고 사용할 수 있습니다.
예를 들어, 다음 코드는 static 전역 변수의 선언 및 사용 예를 보여줍니다.
```c
// 파일 1
#include
static int num = 10; // static 전역 변수 선언
void printNum() {
printf(Number: %d\n, num);
}
```
```c
// 파일 2
#include
extern int num; // 외부 파일에 정의된 static 전역 변수를 사용하기 위해 extern 키워드 사용
int main() {
printNum(); // static 전역 변수 출력
return 0;
}
```
2. extern 전역 변수
extern 키워드는 C 및 C++에서 다른 파일에 선언된 전역 변수를 참조하는 데 사용됩니다. extern을 사용하여 변수를 선언하면 현재 파일에서 해당 변수를 정의하지 않고, 다른 파일에서 정의한 변수를 사용할 수 있습니다. 이로써 다른 파일에 선언된 전역 변수를 사용하여 데이터를 공유할 수 있습니다. 일반적으로 extern은 헤더 파일에 변수를 선언할 때 주로 사용됩니다.
다음은 extern 전역 변수의 선언 및 사용 예입니다.
```c++
// 파일 1
extern int num; // 다른 파일에 정의된 전역 변수 사용을 위해 extern 키워드 사용
void setNum(int value) {
num = value; // 외부 변수에 값 할당
}
```
```c++
// 파일 2
#include
int num; // 전역 변수 정의
extern void setNum(int value); // 외부 파일에서 정의된 함수 사용
int main() {
setNum(20); // 외부 변수 값 설정
printf(Number: %d\n, num); // 외부 변수 값을 출력
return 0;
}
```
이와 같이 C 및 C++에서 static 및 extern 전역 변수는 프로그래머들에게 유용한 기능을 제공합니다. static 전역 변수는 파일 범위에서만 접근할 수 있고, 다른 파일에서는 접근할 수 없으므로 프로젝트 관리에 도움을 줍니다. extern 전역 변수는 다른 파일에서 정의된 변수를 참조하여 데이터를 공유할 수 있도록 해줍니다. 이러한 특성들은 C 및 C++에서 전역 변수를 효과적으로 사용할 수 있도록 도와줍니다.
문서 최적화(SEO)를 고려하여 작성된 이 기사는 C 및 C++에서 static과 extern 전역 변수에 대한 이해를 돕기 위해 제공되었습니다. 지속적인 학습과 경험을 통해 프로그래머들은 이러한 기능들을 효율적으로 활용하여 코드의 유지 관리를 개선할 수 있을 것입니다.

반응형
Comments