>백엔드 개발 >C++ >C 클래스에서 정적 constexpr char 배열을 사용할 때 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇입니까?

C 클래스에서 정적 constexpr char 배열을 사용할 때 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-19 14:13:10767검색

Why Do I Get an

정적 constexpr char에 대한 정의되지 않은 참조[]

C에서 클래스 내에서 정적 const char 배열을 선언하고 이를 클래스 내에서 사용할 때 멤버 함수를 사용하면 정의되지 않은 참조를 나타내는 오류가 발생할 수 있습니다. 이 오류는 정적 멤버의 선언과 정의가 분리되어 발생합니다.

문제

다음 예를 고려하세요.

// header file (foo.hpp)
struct Foo {
  void bar();
  static constexpr char baz[] = "qux";
};

// cpp file (foo.cpp)
void Foo::bar() {
  std::string str(baz); // undefined reference to baz
}

여기서 예를 들어 정적 const char 배열 baz는 클래스 내에서 선언되었지만 정의되지는 않았습니다. GCC로 코드를 컴파일하면 "baz에 대한 정의되지 않은 참조" 오류가 발생합니다.

솔루션

이 문제를 해결하려면 정적에 대한 정의를 제공해야 합니다. cpp 파일의 멤버입니다. 이 정의는 배열의 실제 내용을 지정합니다. 위의 예에서 cpp 파일에 다음 줄을 추가합니다.

constexpr char Foo::baz[];

Explanation

C에서 정적 멤버에는 선언과 정의가 모두 필요합니다. 별도의 개체입니다. 선언은 멤버의 유형과 이름을 지정하고 정의는 실제 구현이나 값을 제공합니다.

클래스 내에서 선언된 정적 멤버의 경우 선언은 일반적으로 초기화 프로그램과 함께 클래스 정의에 나타납니다. 그러나 정의는 클래스 정의 외부, 일반적으로 별도의 cpp 파일 또는 클래스 정의 끝에서 제공되어야 합니다.

정적 멤버 baz에 대한 정의를 제공함으로써 링커는 다음을 해결할 수 있습니다. 참조하고 필요한 코드를 생성합니다. 정의가 없으면 링커는 배열의 실제 내용을 확인할 수 없으며 정의되지 않은 참조 오류가 발생합니다.

위 내용은 C 클래스에서 정적 constexpr char 배열을 사용할 때 '정의되지 않은 참조' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.