선언 및 정의 (C++)

선언은 프로그램 요소 또는 이름이 있음을 컴파일러에 알립니다. 정의는 이름이 설명하는 코드 또는 데이터를 지정합니다. 이름을 사용하려면 먼저 선언해야 합니다.

선언

선언은 프로그램에 하나 이상의 이름을 제공합니다. 선언은 프로그램에서 두 번 이상 발생할 수 있습니다. 따라서 클래스, 구조체, 열거 형식 및 다른 사용자 정의 형식이 각 컴파일 단위에 대해 선언될 수 있습니다. 이 여러 선언에 대한 제약 조건은 모든 선언이 동일해야 한다는 것입니다. 다음 경우를 제외하고 선언은 정의 역할도 합니다.

  1. 선언이 함수 프로토타입(함수 본문이 없는 함수 선언)입니다.

  2. 선언이 extern 지정자를 포함하지만 이니셜라이저(개체 및 변수) 또는 함수 본문(함수)은 포함하지 않습니다. 이것은 정의가 반드시 현재 변환 단위에 있지 않으며 이름 외부 링크를 제공해 줌을 나타냅니다.

  3. 선언이 클래스 선언 내의 정적 데이터 멤버입니다.

    정적 클래스 데이터 멤버는 클래스의 모든 개체가 공유하는 개별 변수이므로 클래스 선언 외부에서 정의 및 초기화되어야 합니다. 클래스 및 클래스 멤버에 대한 자세한 내용은 클래스를 참조하십시오.

  4. 선언이 class T;과 같은 정의가 뒤따르지 않는 클래스 이름 선언입니다.

  5. 선언이 typedef 문입니다.

다음은 정의이기도 한 선언의 예제입니다.

// Declare and define int variables i and j.
int i;
int j = 10;

// Declare enumeration suits.
enum suits { Spades = 1, Clubs, Hearts, Diamonds };

// Declare class CheckBox.
class CheckBox : public Control
{
public:
            Boolean IsChecked();
    virtual int     ChangeState() = 0;
};

정의가 아닌 일부 선언은 다음과 같습니다.

extern int i;
char *strchr( const char *Str, const char Target );

정의

정의는 개체 또는 변수, 함수, 클래스 또는 열거자의 고유 사양입니다. 정의가 고유해야 하기 때문에 프로그램에는 지정된 프로그램 요소에 대한 정의가 하나만 포함될 수 있습니다. 선언과 정의 간에 다 대 일 대응이 있을 수 있습니다. 프로그램 요소가 선언되지만 정의되지는 않는 두 가지 경우가 있습니다.

  1. 함수가 선언되지만 함수 호출 또는 함수의 주소를 사용하는 식으로 참조되지 않습니다.

  2. 클래스가 정의가 알려질 필요가 없는 방식으로만 사용됩니다. 그러나 클래스는 선언되어야 합니다. 다음 코드에서는 이러한 경우를 보여 줍니다.

    // definitions.cpp
    class WindowCounter;   // Forward reference; no definition
    
    class Window
    {
       // Definition of WindowCounter not required
       static WindowCounter windowCounter;
    };
    
    int main()
    {
    }
    

참고 항목

참조

기본 개념