Static Const Int에 대한 정의되지 않은 참조: A 해상도
최근 프로그래밍 시나리오에서 "정의되지 않은 참조에 대한 참조"라는 메시지와 함께 컴파일 오류가 발생했습니다. '바::kConst'". 오류는 다음 코드 조각에서 발생했습니다.
class Bar { public: static const int kConst = 1; void func() { foo(kConst); // Error-prone line } };
정적 상수 멤버 "kConst"가 정의되지 않았기 때문에 오류가 발생했습니다. 일반적으로 컴파일러는 컴파일 타임에 필요한 대체 작업을 수행할 것으로 예상됩니다. 그러나 이 경우 "foo" 함수는 "const int &" 매개변수를 사용하므로 컴파일러는 대체보다 참조를 선호하게 됩니다.
문제를 해결하려면 다음 수정 사항을 사용할 수 있습니다.
foo(static_cast<int>(kConst));
이 접근 방식은 컴파일러가 임시 "int"를 생성하고 이에 대한 참조를 전달하도록 하여 성공적인 컴파일을 가능하게 합니다.
관찰된 동작은 C 표준( 9.4.2/4), 이는 상수 정수 유형의 정적 데이터 멤버에 상수 초기화 프로그램이 있는 경우 정수 상수 표현식에 나타날 수 있음을 명시합니다. 그러나 프로그램에서 사용되는 경우에는 여전히 네임스페이스 범위에서 정의되어야 합니다.
주어진 코드에서 정적 데이터 멤버를 상수 참조로 전달하는 것은 C 표준(3.2/2)에 따른 "사용"을 구성합니다. 이는 컴파일러가 "kConst"에 대한 정의의 존재를 강제할 의무가 있음을 의미합니다.
GCC가 때때로 특정 시나리오에서 이 요구 사항을 간과할 수 있지만 일반적으로 표준을 준수하고 참조 사용을 자제하는 것이 좋습니다. 존재하지 않는 개체의 주소를 가져오거나 가져옵니다.
위 내용은 참조로 정적 상수 Int를 전달하면 C에서 \'정의되지 않은 참조\' 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!