>  기사  >  백엔드 개발  >  함수에서 정적 const int 멤버를 사용할 때 \"Bar::kConst\'\에 대한 정의되지 않은 참조" 오류가 발생하는 이유는 무엇입니까?

함수에서 정적 const int 멤버를 사용할 때 \"Bar::kConst\'\에 대한 정의되지 않은 참조" 오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-30 19:29:03778검색

Why do I get an

정적 const int에 대한 정의되지 않은 참조

질문:

다음 코드를 고려하세요.

<code class="cpp">class Bar {
public:
  static const int kConst = 1;
  void func() { foo(kConst); }
};

int main() { Bar b; b.func(); }</code>

이 코드를 컴파일하는 동안 "'Bar::kConst'에 대한 정의되지 않은 참조"라는 오류가 발생합니다. 이 문제가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

답변:

이 오류는 정적 const int 멤버를 사용하는 경우(함수 또는 캐스트에 전달됨) 때문에 발생합니다. 는 네임스페이스 범위에서 정의되어야 합니다.

C 11 섹션 9.4.2/4에 따르면:

"정적 데이터 멤버가 const 정수 또는 const 열거 유형인 경우 해당 선언은 클래스 정의는 정수 상수 표현식이 되는 상수 초기화 프로그램을 지정할 수 있습니다. 이 경우 멤버는 정수 상수 표현식에 나타날 수 있습니다. 멤버는 프로그램에서 사용되는 경우 계속해서 네임스페이스 범위에 정의됩니다. 🎜>

const 참조로 정적 데이터 멤버를 전달하는 것은 C 11 섹션 3.2/2에 따라 "사용"으로 간주됩니다.

"...이 sizeof 연산자의 피연산자가 아닌 한 표현식은 잠재적으로 평가됩니다. ... or는 typeid 연산자의 피연산자이고 ...는 다형성 클래스 유형의 lvalue를 지정하지 않습니다. 해당 이름이 잠재적으로 평가되는 표현식에 나타나면 객체 또는 오버로드되지 않은 함수가 사용됩니다."

그러나 GCC는 처음에 정적 const 멤버를 네임스페이스 범위에서 정의하지 않고 const 참조로 전달하는 것을 허용했습니다. C 0x 초안에서는 이것이 더 이상 허용되지 않습니다.

정적 const 멤버와 같이 존재하지 않는 개체의 주소나 참조를 가져올 때 실질적인 문제가 발생합니다. 여러 번역 단위에서 호출되면 정의되지 않은 동작이 발생할 수 있습니다.

이 문제를 해결하려면 다음과 같이 수정하면 됩니다.

  • 정적 const 멤버 정의 네임스페이스 범위:

    <code class="cpp">int bar::kConst = 1;</code>
  • static_cast(kConst)를 사용하여 컴파일러가 임시 int 객체를 만들고 이에 대한 참조를 전달하도록 합니다.

    <code class="cpp">foo(static_cast<int>(kConst));</code>

위 내용은 함수에서 정적 const int 멤버를 사용할 때 \"Bar::kConst\'\에 대한 정의되지 않은 참조" 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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