2016-09-15 6 views
1

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입니다)

답변

3

N4296는 말한다 :

 union { member-specification } ; 

익명 조합이라고 형태의 조합; 명명되지 않은 유형의 명명되지 않은 객체를 정의합니다. 비 정적 데이터 부재를 정의하거나 static_assert 선언되어야하며 익명 연합 부재 명세 각 멤버 선언 . [ : 중첩 된 형식, 익명의 공용체 및 함수는 익명 공용체 내에서 선언 할 수 없습니다. - 엔드 노트] 여기가 정확히 무엇

- 당신이 클래스 이름이나 멤버 이름이없는, 당신은 m_halfs에 대한 새로운 구조체 형식을 발명 할 수 없습니다 그래서. 나는 구조체 정의를 노조 밖으로 옮기는 것이 좋습니다.

class Dword 
    { 
    ... 
    private: 
     struct word_struct 
     { 
     #ifdef IS_LITTLE_ENDIAN 
      word low; 
      word high; 
     #else 
      word high; 
      word low; 
     #endif 
     }; 
     union 
     { 
     #ifdef CRYPTOPP_NATIVE_DWORD_AVAILABLE 
      dword m_whole; 
     #endif 
      word_struct m_halfs; 
     }; 
    }; 

이 성능에 영향을 미치지 않는다 (그러나 변수의 다른 부분에 액세스하기 위해 노동 조합을 사용하여이 트릭은 엄격한 앨리어싱 규칙의 파울 떨어질 수 있습니다. - 프로그램이 정의되지 않은 동작이있을 수 있습니다 의미)한다

+0

고맙습니다. 이미 변경 사항을 테스트하기위한 지점 설정이 이미 있습니다. * "...하지만 변수의 다른 부분에 액세스하기 위해 노동 조합을 사용하는 속임수에주의하십시오."* - 예, 저를 걱정합니다. 우리는 [64 비트 unsigned int에서 __m128 유형 초기화] (http://stackoverflow.com/a/38547909/608639)에서 동일한 문제가 발생했습니다. C * ++가 "액티브 조합원 액세스"영역에서 좀 더 편안해 지길 바랬습니다. C 코드가 포함 된 C++ 프로그램은 그러한 공통 패턴 때문에 위험 할 수 있습니다. – jww

+0

@ M.M : 죄송합니다. 당신은 맞습니다. 그것은 C++ 17 표준의 최신 초안입니다. 나는 텍스트를 고정시키고 (링크를 넣는다.) –

+0

@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