2014-02-07 3 views
0

구조체에 상수 값을 저장하는 방법은 무엇입니까? LEBEL0에 const를 넣으면 LEBEL1에 const를 할당 할 수 없습니다. 하지만 const를 LEBEL0에 놓지 않으면 LEBEL1에서 한정자를 잃어 버리게됩니다. 이 일을 할 수있는 방법이 있습니까? ...C에서 구조체에 const 값을 저장하는 방법 (C++이 아님)?

typedef struct _MyStruct 
    { 
     const SomePointerType pktData; <--LABEL0 
    }MyStruct; 

    const SomePointerType SomeFunctionICannotModify() 
    { 
    … 
    } 

    void SomeFunction() 
    { 
     MyStruct data; 
    …. 
     data.pktData = SomeFunctionICannotModify(); <--LABEL1 
    .... 
     SomeSubFunction(&data); 
    } 

    void SomeSubFunction(MyStruct* data) 
    { 
     this function does not modify any fields in "data". 
    } 

PS를 I (아래) 더러운 솔루션을 함께했다하지만 난 더 좋은 일이있을 수 있다고 생각 : 위의 코드는 내 문제를 설명하는 "모델"이 아닌 실제 코드이다. 그것은 내 실제 프로그램의 모든 코드를 가지고 있지 않습니다. "왜 그럴 수 있니?", "할 필요 없다", "그 코드는 컴파일되지 않는다"등의 질문을하지 마십시오.

내 더러운 솔루션

typedef struct _ConstHolder 
    { 
     const SomePointerType pktData; 
    }ConstHolder; 

    typedef struct _MyStruct 
    { 
     ConstHolder holder; 
    }MyStruct; 

    void SomeFunction() 
    { 
     MyStruct data; 
    …. 
     ConstHolder holder = {SomeFunctionICannotModify()}; 
     data.holder = holder; 
    .... 
     SomeSubFunction(&data); 
    } 
+1

왜 const가되어야합니까? –

+0

가짜 코드를 "당신의 문제를 설명"하는 대신, 실제로 간단한 컴파일 가능한 예제를 만드는 것이 어떻습니까? 마찬가지로 쉽고 이해하기 어려웠을 것입니다. –

답변

0

귀하의 질문은 이해하기 어려운,하지만 당신은 당신이 할당 한 후 pktData을 수정할 수있는 오해에서 할 수있다. 이것은 사실이 아닙니다. 포인터를 재 할당 할 수 없다는 말을하지 않습니다

const char * str = "hello"; 
printf("%s\n", str); 
str = "goodbye"; 
printf("%s\n", str); 

를 const,하지만 당신은이 지점에 데이터를 변경할 수 없습니다 대신 것을 : 완벽하게 합법적 인 다음을 고려하십시오.

0

const와 함께 typedef를 사용하고 있다는 것이 나에게 문제인 것처럼 보입니다. C에 관한 한 가지 점은 const가 C++에서와 같이 잘 구현되고 사용 가능하지 않다는 것입니다. typedef도 잘 수행되지 않습니다.

This article talks a bit about const in C. this article as well on const in C도 마찬가지입니다. 당신이 다음을 사용하는 경우

예를 들어, 내가 다음 줄을 추가 같은 것을 수행하여 josey.pSome이 가리키는 것을 수정하려고한다면 비주얼 스튜디오 2005

typedef char * pchar; 

typedef struct { 
    int i; 
    int j; 
} Thing; 

typedef Thing * SomePtr; 

typedef struct { 
// const SomePtr pSome; 
// const pchar mychar; 
    const char * mychar; 
    const Thing *pSome; 
} MyStruct; 

const SomePtr SomePtrFunc() 
{ 
    static Thing jj = {1, 2}; 

    return &jj; 
} 

int main(int argc, char **argv) 
{ 
    MyStruct josey; 

    josey.pSome = SomePtrFunc(); 

    josey.mychar = "this"; 
    return 0; 
} 

에서 아무런 문제없이 컴파일 josey.pSome->i = 0; 같은 코드를 컴파일하면 오류가 발생합니다. C2166 : l-value는 const 개체을 지정합니다. L-값이 지정

typedef char * pchar; 

typedef struct { 
    int i; 
    int j; 
} Thing; 

typedef Thing * SomePtr; 

typedef struct { 
    const SomePtr pSome; 
    const pchar mychar; 
// const char * mychar; 
// const Thing *pSome; 
} MyStruct; 

const SomePtr SomePtrFunc() 
{ 
    static Thing jj = {1, 2}; 

    return &jj; 
} 

int main(int argc, char **argv) 
{ 
    MyStruct josey; 

    josey.pSome = SomePtrFunc(); // <- error C2166: l-value specifies const object 

    josey.mychar = "this";  // <- error C2166: l-value specifies const object 
    return 0; 
} 

마지막으로 당신이 할 수있는 어떤 형식 정의를 만드는 것입니다 const를 목적 : 당신이 의견에 다음 코드를 사용하는 경우

그러나 당신이 오류 C2166의 오류 메시지가 주위 전환 const 한정자를 포함하여 const 한정자를 다음과 같이 입력하십시오.

typedef const char * pchar; 

typedef struct { 
    int i; 
    int j; 
} Thing; 

typedef const Thing * SomePtr; 

typedef struct { 
    SomePtr pSome; 
    pchar mychar; 
// const char * mychar; 
// const Thing *pSome; 
} MyStruct; 
관련 문제