> 백엔드 개발 > C++ > C 클래스에서 Static Const Integer 멤버를 정의할 때 링커 오류가 발생하는 이유는 무엇입니까?

C 클래스에서 Static Const Integer 멤버를 정의할 때 링커 오류가 발생하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-01 13:14:09
원래의
239명이 탐색했습니다.

Why Do I Get a Linker Error When Defining Static Const Integer Members in a C   Class?

클래스 정의에서 정적 Const 정수 멤버 정의 시 링커 오류

C의 클래스 선언을 사용하면 클래스 내에서 정적 const 정수 멤버를 정의할 수 있습니다. 수업. 그러나 제공된 예제와 유사한 코드에서 링커 오류가 발생할 수 있습니다.

class test {
public:
    static const int N = 10;
};

int main() {
    std::cout << test::N << "\n";
    std::min(9, test::N);
}
로그인 후 복사

컴파일러가 클래스 정의를 허용하는 동안 링커는 test::N에 대한 정의되지 않은 참조를 보고합니다. 클래스의 선언이 실제 정의가 아니기 때문에 문제가 발생합니다.

C에서 정적 const 정수 멤버는 네임스페이스 범위의 클래스 외부에서 정의되어야 합니다. 이는 C 표준(9.4.2/4)에 따라 클래스 선언 내에서 초기화될 수 없기 때문입니다.

정적 데이터 멤버가 const 정수 또는 const 열거 유형인 경우 클래스 정의의 해당 선언 상수 초기화 프로그램을 지정할 수 있습니다. [...] 이 경우 멤버는 정수 상수 표현식에 나타날 수 있습니다. 멤버가 프로그램에서 사용되고 네임스페이스 범위 정의에 초기화 프로그램이 포함되지 않으면 멤버는 여전히 네임스페이스 범위에 정의되어야 합니다.

링커 오류를 해결하려면 클래스 외부에서 정적 const 멤버를 정의할 수 있습니다. , 일반적으로 해당 소스 파일에 있습니다.

const int test::N = 10;
로그인 후 복사

또는 C 11 이상의 경우 constexpr 키워드를 사용하여 클래스 내에서 실제 정의를 생성할 수 있습니다. 선언:

class test {
public:
    static constexpr int N = 10;
};
로그인 후 복사

위 내용은 C 클래스에서 Static Const Integer 멤버를 정의할 때 링커 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿