내 이해는 C ++에서는 정수 유형 인 한 클래스 내에서 정적 const 멤버를 정의 할 수 있다는 것입니다.
그러면 다음 코드에서 링커 오류가 발생하는 이유는 무엇입니까?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
내가 얻는 오류는 다음과 같습니다.
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
흥미롭게도 std :: min에 대한 호출을 주석 처리하면 코드가 잘 컴파일되고 연결됩니다 (이전 행에서도 test :: N이 참조 되었음에도 불구하고).
무슨 일이 일어나고 있는지 아십니까?
내 컴파일러는 Linux에서 gcc 4.4입니다.
char
에는 대신 constexpr static const char &N = "n"[0];
. 를 참고 &
. 리터럴 문자열이 자동으로 정의되기 때문에 이것이 작동한다고 생각합니다. 나는 이것에 대해 다소 걱정됩니다. 문자열이 여러 다른 주소에있을 것이므로 다른 번역 단위 사이의 헤더 파일에서 이상하게 작동 할 수 있습니다.
inline const int N = 10
내 지식에는 여전히 링커가 정의한 저장소가 있습니다. 이 경우 키워드 인라인을 사용 하여 클래스 정의 테스트 내에서 정적 변수 정의 를 제공 할 수도 있습니다 .