내가 가진 경우 : a.hpp a.cpp 및 main.cpp는 a.hpp를 포함하고 a.hpp에서 나는 씁니다
template<typename T>
constexpr int num;
template<>
constexpr int num<float> = 1;
template<>
constexpr int num<double> = 2;
ao와 main.o에서 변수 num을 여러 번 정의 할 위험이 있습니까? 아니면 인라인으로 선언됩니까? a.cpp 안에 템플릿 변수 전문화를 넣어야합니까? a.hpp를 네임 스페이스로 래핑하면 어떻게됩니까?
num
ao와 main.o에서 변수를 여러 번 정의 할 위험이 있습니까?
그렇습니다. 템플릿이 아닌 변수의 constexpr
경우은 암시 const
하고 const
네임 스페이스 수준에서는 내부 연결을 의미하지만 변수 템플릿에는 적용되지 않습니다. 이것은 표준에 명시되어 있지 않은 것 같습니다. 현재 초안에는 다음이 있습니다.
참고 1 : 규정 된
const
유형 이있는 인스턴스화 된 변수 템플릿은 선언되지 않은 경우에도 외부 또는 모듈 연결을 가질 수 있습니다extern
.
실험적으로 서로 다른 컴파일러는 서로 다른 연결을 제공합니다. 예를 들어 GCC 9.3.0 및 10.2.0 num<float>
에는 내부 연결이 있습니다.
nm -C a.o ... 0000000000000004 r num<float>
하지만 Clang 10.0.0에서는 외부 연결이 있습니다.
nm -C a.o ... 0000000000000000 R num<float>
결과적으로 a.hpp
두 개의 컴파일 단위 에 포함하려고하면 Clang에서 링크 오류가 발생합니다.
아니면 인라인으로 선언됩니까?
아니요, 명시 적이 inline
필요합니다.
a.hpp를 네임 스페이스로 래핑하면 어떻게됩니까?
명명되지 않은 네임 스페이스에 대해 이야기하고있는 것 같습니다. 이 경우 각 컴파일 단위는 자체 (개인) 사본을 확보 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다