현재 C++에서 귀찮은 문제가 있습니다. 나의 현재의 맥락에서C++ 정적 클래스 멤버가 * 정적 라이브러리에서 초기화되지 않았습니다. *
, 우리는 주로 C++ 실행 파일 (주로 리눅스 임베디드 시스템)를 사용 :(나는 지난 20 년 동안 직면하지 않은 이유
사실, 난 정적 이해하지 않는다 우리 고유의 정적 libs와 함께 링크. 우리가 기술 및 최적화 이유로 정적 libs와 사용합니까. 지난 몇 년 동안
, 참으로, 나는
그래서 내가 쓰기 시작 ...하지만 공유 libs와를 만드는 데 사용 정적 클래스 멤버가있는 일부 클래스. 다음과 같이 입력하십시오 :class Inner
{
public:
Inner()
{
std::cout << "CTOR Inner" << std::endl;
}
};
class A
{
static Inner _inner;
...
};
// in the .cpp
Inner A::_inner;
///////////////////////
매우 기본적인 유스 케이스입니까?
하지만 lib와 연결된 단위 테스트에서 콘솔에 std::cout
문을 볼 수 없습니다. 반면에 클래스 Inner와 A를 실행 가능한 소스 코드로 옮기면 잘 동작합니다.
나는 그것이 매우 기본적인 문제라고 확신하며 나는 지난 몇 년 동안 결코 직면 해 본 적이 없다는 것을 알고있다. 컴파일러와 관련된 문제입니까? Windows 및 Linux에서 두 경우를 모두 테스트했습니다 (Debian, GCC 4.9).
모든 아이디어를 환영합니다. 당신은이
Z.
글로벌 변수에만 포함 된 번역 단위에서 기업의 첫 번째 ODR 사용하기 전에 초기화를 보장합니다. TU를 사용하지 않으면 전역 초기화를 보장 할 수 없습니다. –
확인. 그래서 나는 "적절하게"초기화를 강제하는 해결 방법을 찾아야한다 ... 좋다. – Zyend
실제 사용 사례는 무엇입니까? 정적 라이브러리에 단순하게 링크하는 것만으로도 부작용이 없다는 기대에 부합됩니다. 만약 내가 무언가를 사용하지 않는다면, 나는 그것을 지불 할 필요가 없어야한다. 그것은 C와 C++의 디자인 원리이다. – zett42