정적 변수 초기화에 관한 많은 질문을 읽은 후에도이 문제가 const
변수에 어떻게 적용되는지 확실하지 않습니다. 나는 static
키워드를 읽은 내용에 따르면 헤더 파일과 정적 초기화 실패의 const 변수
static const std::string path1 = "/xyz/abc";
static const std::string path2 = "/etc";
이 필요하지 않습니다, 심지어 여기에 사용되지 않는 :
나는 빌드 스크립트에 의해 생성 된 헤더 파일 config.h
에 다음 코드의 종류가 있습니다.
내 질문 : 위의 코드가 정적 초기화 실패로 이어질 수 있습니까?
나는이 (가) 헤더 파일 myclass.h
에 다음과 같은 경우 :
class MyClass
{
public:
MyClass(const std::string& str) : m_str(str) {}
std::string Get() const { return m_str; }
private:
std::string m_str;
}
const MyClass myclass1("test");
이 정적 초기화에 문제를 제기 할 것인가?
오른쪽으로 이해한다면 const
변수가 내부 연결을 가지고 있기 때문에 두 경우 모두 문제가 없어야합니까?
편집 :이 사용에 관한
#include <config.h>
#include <myclass.h>
std::string anotherString(path1 + myclass1.Get());
int main()
{
...
}
또 다른 질문 :
main.cpp
에서 :
(때문에 dribeas 대답) 아마 나는 같은 사용 사례에 관심이 있음을 언급해야한다 case :이 경우 컴파일러가 path2
을 최적화 할 예정입니까?
이 static'는 구현 파일에서 사용할 수있는 '사실이 아니다. –
물론 C++의 구현 파일에 대한 개념이 전혀 없습니다. 단어를 변경하려고합니다. – Philipp
찾고있는 문구는 구현 파일 대신 "번역 단위"라고 생각합니다. 값은 헤더에 선언되고 최대 하나의 번역 단위로 정의되어야합니다. 이 경우 const이고 내부 연결을 암시하므로 링크 타임에 다중 정의 기호 오류가 발생하지 않지만이 머리글을 포함하는 모든 변환 단위에 동일한 기호가 정의되어 있습니다. 내부 링크가 있기 때문에 링크가 끊어지지는 않지만 컴파일러는 중복을 제거하지 못할 수도 있습니다. 한 번 헤더에서 문자열의 정의를 제거하여 실행 파일에서 8MB를 면도했습니다. – legalize