programing

C 및 C++의 정적 및 외부 글로벌 변수

powerit 2023. 6. 12. 21:57
반응형

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

반응형