SunCC 5.12에서 5.14까지 컴파일 경고가 있습니다. Clang, GCC, ICC 및 MSVC와 같은 다른 컴파일러는 불평하지 않습니다. 전에 진단하지 못했기 때문에 진단에 대해 잘 모르겠습니다.SunCC 5.12 ~ 5.14 및 "익명 공용체에서 유형을 선언 할 수 없습니다"
해당 코드는 BigInteger
class이고 문제 조합은 다음과 같습니다. 이 클래스는 carry-with-multiplies와 umulx
같은 하드웨어를 사용하여 수행 할 수있는 곱셈을 처리 할 수있는 가장 큰 기계어를 찾습니다. Anonymous Unions에서 마이크로 소프트에 따르면
[ 3%] Building CXX object CMakeFiles/cryptopp-object.dir/integer.cpp.o
/opt/solarisstudio12.3/bin/CC -fPIC -native -m64 -template=no%extdef -o CMakeFiles/cryptopp-object.dir/integer.cpp.o
-c /export/home/jwalton/cryptopp/integer.cpp
CC: Warning: -xchip=native detection failed, falling back to -xchip=generic
"/export/home/jwalton/cryptopp/integer.cpp", line 335: Warning: Types cannot be declared in anonymous union.
1 Warning(s) detected.
:
class Dword
{
...
private:
320 union
321 {
322 #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE
323 dword m_whole;
324 #endif
325 struct
326 {
327 #ifdef IS_LITTLE_ENDIAN
328 word low;
329 word high;
330 #else
331 word high;
332 word low;
333 #endif
334 } m_halfs;
335 };
336 };
여기 경고의
은 단순히 노동 조합 익명 조합하지 않는 구문의 클래스 이름 부분을 생략. 노동 조합이 익명의 공용체로서의 자격을 갖추려면, 선언은 객체를 선언해서는 안된다. 내가 제대로 일을 이해한다면
, 우리는 아무도 그 다음 라인 (325)에서 시작하는 개인 회원 struct {...} m_halfs
를 인스턴스화 할 수 없기 때문 익명 구조체를 할 , SunCC 익명 조합을 불평하는 것은 회원 struct {...} m_halfs
있습니다. 그 맞습니까?
struct {...} m_halfs
에 문제가있는 경우 어떻게하면 휴대용 방식으로 해결할 수 있습니까?
문제가 아니라면 SunCC는 무엇에 관해 불평하고 있습니까?
이 문제를 해결하는 방법에 대해주의해야합니다. 성능이 최우선 순위이며 코드가 중요한 경로에 있습니다. 또한 현대 컴파일러에 GCC 3 및 VC++ 6.0을 지원합니다. 및 C++ 03, C++ 11, C++ 14 및 C++ 17.
마지막 질문은 "아무것도하지 말고 Solaris에서 Solaris와 함께 살아야합니까? 합니다 (C++ 17 표준의 firstdraft입니다)
고맙습니다. 이미 변경 사항을 테스트하기위한 지점 설정이 이미 있습니다. * "...하지만 변수의 다른 부분에 액세스하기 위해 노동 조합을 사용하는 속임수에주의하십시오."* - 예, 저를 걱정합니다. 우리는 [64 비트 unsigned int에서 __m128 유형 초기화] (http://stackoverflow.com/a/38547909/608639)에서 동일한 문제가 발생했습니다. C * ++가 "액티브 조합원 액세스"영역에서 좀 더 편안해 지길 바랬습니다. C 코드가 포함 된 C++ 프로그램은 그러한 공통 패턴 때문에 위험 할 수 있습니다. – jww
@ M.M : 죄송합니다. 당신은 맞습니다. 그것은 C++ 17 표준의 최신 초안입니다. 나는 텍스트를 고정시키고 (링크를 넣는다.) –
@MartinBonner - SunCC 12.3은 그 가치가 무엇인지 2012 년 11 월에 발표되었습니다. C++ 컴파일러는'-std = C++ 03' 또는'-std = C++ 11'을 지원하지 않습니다. Sun Studio 12.4 C++ 컴파일러가 C++ 11을 처음으로 제공했습니다. 오라클은 C++ 14 또는 C++ 17 지원을 아직 제공하지 않았습니다. 나는 추측하고있다. (순전히 추측이다.) C++ 14 지원은 앞으로 2 년 내에 도착할 것이다. C++ 17은 2020 년경에 사용 가능할 것입니다 ... – jww