선언 및 정의(C++)

C++ 프로그램은 변수, 함수, 형식 및 네임스페이스와 같은 다양한 엔터티로 구성됩니다. 이러한 각 엔터티를 사용하려면 먼저 선언해야 합니다. 선언은 엔터티의 형식 및 기타 특성에 대한 정보와 함께 엔터티의 고유한 이름을 지정합니다. C++에서 이름이 선언되는 지점은 컴파일러에 표시되는 지점입니다. 컴파일 단위의 일부 이후 지점에서 선언된 함수 또는 클래스를 참조할 수 없습니다. 변수는 사용되는 지점 이전에 가능한 한 가깝게 선언해야 합니다.

다음 예제에서는 몇 가지 선언을 보여 줍니다.

#include <string>

int f(int i); // forward declaration

int main()
{
    const double pi = 3.14; //OK
    int i = f(2); //OK. f is forward-declared
    C obj; // error! C not yet declared.
    std::string str; // OK std::string is declared in <string> header
    j = 0; // error! No type specified.
    auto k = 0; // OK. type inferred as int by compiler.
}

int f(int i)
{
    return i + 42;
}

namespace N {
   class C{/*...*/};
}

줄 5에서 함수가 main 선언됩니다. 줄 7에서 const 이름이 지정된 pi 변수가 선언되고 초기화됩니다. 8줄에서 정 i 수가 선언되고 함수 f에서 생성된 값으로 초기화됩니다. f 이름은 줄 3의 전달 선언으로 인해 컴파일러에 표시됩니다.

줄 9에서는 형식 C 의 이름이 지정된 obj 변수가 선언됩니다. 그러나 이 선언은 프로그램의 뒷부분까지 선언되지 않고 앞으로 선언되지 않으므로 오류가 C 발생합니다. 오류를 해결하려면 이전 mainC 전체 정의를 이동하거나 정방향 선언을 추가할 수 있습니다. 이 동작은 C#과 같은 다른 언어와 다릅니다. 이러한 언어에서는 소스 파일의 선언 지점 이전에 함수 및 클래스를 사용할 수 있습니다.

줄 10에서는 형식 std::string 이라는 변수 str 가 선언됩니다. 이 이름은 std::string 헤더 파일에 도입되어 string1줄의 원본 파일에 병합되므로 표시됩니다. std 는 클래스가 string 선언되는 네임스페이스입니다.

11줄에서 이름이 j 선언되지 않았기 때문에 오류가 발생합니다. 선언은 JavaScript와 같은 다른 언어와 달리 형식을 제공해야 합니다. 12 auto 줄에서 키워드(keyword) 사용되며, 컴파일러가 초기화된 값에 따라 형식 k 을 유추하도록 지시합니다. 이 경우 컴파일러는 형식을 int 선택합니다.

선언 범위

선언에 의해 도입된 이름은 선언이 발생하는 범위 내에서 유효합니다. 이전 예제에서 함수 내에 main 선언된 변수는 지역 변수입니다. 전역 범위에서 기본 외부에서 명명된 i 다른 변수를 선언할 수 있으며 별도의 엔터티가 됩니다. 그러나 이러한 이름이 중복되면 프로그래머의 혼란과 오류가 발생할 수 있으므로 피해야 합니다. 줄 21에서 클래스 C 는 네임스페 N이스의 범위에서 선언됩니다. 네임스페이스를 사용하면 이름 충돌을 방지 할 수 있습니다. 대부분의 C++ 표준 라이브러리 이름은 네임스페이 std 스 내에서 선언됩니다. 범위 규칙이 선언과 상호 작용하는 방법에 대한 자세한 내용은 범위를 참조하세요.

정의

함수, 클래스, 열거형 및 상수 변수를 포함한 일부 엔터티는 정의되고 선언되어야 합니다. 정의엔터티가 프로그램의 뒷부분에서 사용될 때 컴퓨터 코드를 생성하는 데 필요한 모든 정보를 컴파일러에 제공합니다. 이전 예제에서 줄 3에는 함수에 대한 선언이 포함되어 있지만 함수 f 에 대한 정의는 15~18줄에 제공됩니다. 21줄에서 클래스 C 는 선언되고 정의됩니다(정의된 대로 클래스는 아무 작업도 수행하지 않음). 상수 변수를 정의해야 합니다. 즉, 값이 선언된 것과 동일한 문에 값을 할당해야 합니다. 컴파일러가 할당할 공간을 알고 있으므로 기본 제공 형식의 선언(예: int 자동으로 정의)입니다.

다음 예제에서는 정의인 선언도 보여 줍니다.

// 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 );

Typedefs 및 using 문

이전 버전의 C++typedef에서는 키워드(keyword) 다른 이름의 별칭인 새 이름을 선언하는 데 사용됩니다. 예를 들어 형식 std::string 은 .의 다른 이름 std::basic_string<char>입니다. 프로그래머가 실제 이름이 아닌 typedef 이름을 사용하는 이유는 분명합니다. 최신 C++using에서는 키워드(keyword) 선호typedef되지만 아이디어는 동일합니다. 이미 선언되고 정의된 엔터티에 대해 새 이름이 선언됩니다.

정적 클래스 멤버

정적 클래스 데이터 멤버는 클래스의 모든 개체에서 공유하는 불연속 변수입니다. 공유되므로 클래스 정의 외부에서 정의하고 초기화해야 합니다. 자세한 내용은 클래스를 참조 하세요.

extern 선언

C++ 프로그램에는 둘 이상의 컴파일 단위가 포함될 수 있습니다. 별도의 컴파일 단위에 정의된 엔터티를 선언하려면 키워드(keyword) 사용합니다 extern . 선언의 정보는 컴파일러에 충분합니다. 그러나 연결 단계에서 엔터티의 정의를 찾을 수 없는 경우 링커에서 오류가 발생합니다.

이 섹션의 내용

스토리지 클래스
const
constexpr
extern
Initializers
별칭 및 typedef
using 선언
volatile
decltype
C++의 특성

참고 항목

기본 개념