ENDIANS에 관련하여 질문 있습니다.

  • 빠비
    빠비

    안녕하세요.
    튜토리얼의 ENDIANS 문제를 풀다가 컴파일오류가 나서 질문드립니다.
    아래는 제 코드입니다.

    /*큰 엔디안을 작은 엔디안으로 혹은 그 반대로 변환하는 코드*/
    
    #include <iostream>
    using namespace std;
    
    union endian {  //메모리 공간을 공통으로 사용할 때 사용
        unsigned int value;
        struct {    //4바이트를 1바이트씩 자름(8비트)
            unsigned int val1 : 8;
            unsigned int val2 : 8;
            unsigned int val3 : 8;
            unsigned int val4 : 8;
        };
    };
    
    int main(){
    
        int count;  //숫자를 입력받을 횟수
    
        endian Endian;      //변환할 수를 저장
        endian conv_Endian; //변환된 수를 저장
    
        cin>>count;
    
        //입력받은 횟수만큼
        for(int i=0;i<count;i++){
            cin>>Endian.value;
    
            conv_Endian.val1 = Endian.val4;
            conv_Endian.val2 = Endian.val3;
            conv_Endian.val3 = Endian.val2;
            conv_Endian.val4 = Endian.val1;
    
            cout<<conv_Endian.value<<endl;
        }
        return 0;
    }
    

    이 코드를 답으로 제출하니

    submission.cpp:15:2: error: ISO C++ prohibits anonymous structs [-Wpedantic]
    };
    ^
    라는 오류가 떴었습니다.
    검색해보니 union안에 있는 struct에 이름이 정의되어있지 않아 생기는 오류같은데 struct에 value라는 이름을 주고
    conv_Endian.value.val1 = Endian.value.val4;
    라고 고쳐써보니 아예 컴파일이 되지 않았었습니다.

    #pragma GCC diagnostic ignored "-Wpedantic"

    이 문장을 넣어주니 컴파일 에러가 없고 실행되던데 저 문장이 어떤 이유로 컴파일이 되게 만들었는지, conv_Endian.value.val1 = Endian.value.val4; 썼을 때 컴파일이 왜 되지 않았었는지 궁금합니다.


    8년 전
2개의 댓글이 있습니다.
  • WeissBlume
    WeissBlume

    struct에 이름이 없는게 문제가 아니라 struct형 변수의 이름이 없는게 문제입니다(struct { /* ... */ } NAME;).


    8년 전 link
  • 빠비
    빠비

    아 struct NAME{}; 이 아니라 struct {}NAME; 이었군요. 감사합니다!


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.