문제

받는 동안 내 코드는 여기에서 검토되었습니다. 사용의 문제 const 키워드가 나왔어요.변수에 대한 읽기 전용 동작을 구현하는 데 사용된다는 것을 이해합니다.

그것이 유용할 수 있는 다양한 상황이 무엇인지 혼란스럽습니다.

  • 함수 프로토타입의 명확성을 위해 사용해야 합니까?
  • 코드 개발 중에 보안 수단으로 사용해야 합니까?
  • 런타임 상수를 선언하기 위해 다양한 함수 범위에서 사용해야 합니까?
  • 전혀 사용해야합니까?

이 질문은 제가 직면하고 있는 혼란의 예일 뿐입니다.일반적인 혼란은

  • 언제가 되어야 할까요? const C 프로그래밍에 사용되는 키워드?
  • C에서 이 키워드를 사용하면 어떤 이점을 얻을 수 있나요?
  • 사용하는데 단점이 있나요? const 예어?


내 질문의 세부 사항에 이러한 모든 질문이 있기 때문에 이 질문이 너무 광범위할 수 있다는 지적이 있었습니다.나는 단지 이 질문들이 단지 주요 질문에 관한 혼란을 명확히 하기 위한 것임을 분명히 하고 싶었습니다.

C에서 변수에 const 키워드를 언제, 어떤 목적으로 사용해야 합니까?

다음과 같이 다시 표현할 수도 있습니다.

올바른 사용 const C`의 키워드와 동일한 장단점.

도움이 되었습니까?

해결책

코드를 검토할 때 다음 규칙을 적용합니다.

  • 항상 사용 const 함수가 지적 된 데이터를 수정 (또는 자유)하지 않는 참조로 전달되는 함수 매개 변수의 경우.

    int find(const int *data, size_t size, int value);
    
  • 항상 사용 const #define 또는 열거형을 사용하여 정의할 수 있는 상수의 경우.결과적으로 컴파일러는 읽기 전용 메모리(ROM)에서 데이터를 찾을 수 있습니다(임베디드 시스템에서는 링커가 이러한 목적에 더 나은 도구인 경우가 많습니다).

    const double PI = 3.14;
    
  • 함수에 const를 사용하지 마세요 원기 전달된 매개변수에 대해.아무런 의미가 없으므로 단지 '소음'일 뿐입니다.

    // don't add const to 'value' or 'size'
    int find(const int *data, size_t size, int value); 
    
  • 적절한 경우 다음을 사용하십시오. const volatile 프로그램에 의해 변경될 수 없지만 여전히 변경될 수 있는 위치에 있습니다.여기서 하드웨어 레지스터는 일반적인 사용 사례입니다. 예를 들어 장치 상태를 반영하는 상태 레지스터는 다음과 같습니다.

    const volatile int32_t *DEVICE_STATUS =  (int32_t*) 0x100;
    

다른 용도는 선택 사항입니다.예를 들어, 함수 내의 함수에 대한 매개변수 구현 const로 표시할 수 있습니다.

// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)  
{
     ... etc

또는 획득한 후 절대 변경되지 않는 함수 반환 값 또는 계산:

char *repeat_str(const char *str, size_t n) 
{
    const size_t len = strlen(str);
    const size_t buf_size = 1 + (len * n);
    char *buf = malloc(buf_size);
    ...

이러한 용도는 const 단지 변수를 변경하지 않을 것임을 표시하십시오.변수가 저장되는 방법이나 위치는 변경되지 않습니다.물론 컴파일러는 변수가 변경되지 않는다는 것을 알아낼 수 있습니다. const 당신은 그것이 그것을 시행하도록 허용합니다.이것은 독자에게 도움이 될 수 있고 약간의 안전을 추가 할 수 있습니다 (기능이 크거나 복잡하다면 이것이 큰 차이를 만들어 내면 다른 문제가있을 것입니다). 편집 - 예.중첩 된 루프와 길거나 유사한 변수 이름이있는 200 라인 밀도로 코딩 된 기능은 특정 변수가 결코 변하지 않는다는 것을 알면 이해가 크게 쉽게 쉽게 이해할 수 있습니다.이러한 기능은 심하게 설계되거나 유지되었습니다.


문제 const.아마도 "const 중독"이라는 용어를 듣게 될 것입니다.추가할 때 이런 현상이 발생합니다. const 함수 매개 변수에 'constness'가 전파됩니다.

편집 - const 중독:예를 들어 함수에서:

int function_a(char * str, int n)
{
    ...
    function_b(str);
    ...
}

우리가 바꾸면 str 에게 const, 그런 다음 다음을 확인해야 합니다. fuction_b 또한 const.그리고 만약에 function_b 통과하다 strfunction_c, 등.당신이 상상할 수 있듯이, 이것은 많은 별도의 파일/모듈로 전파되면 고통 스러울 수 있습니다.변경할 수없는 함수 (예 : 시스템 라이브러리)로 전파되면 캐스트가 필요합니다.그래서 뿌리고const 기존 코드 주변에서 문제가 발생할 수 있습니다.그러나 새로운 코드에서는 것이 가장 좋습니다 const 적절한 경우 지속적으로 자격을 갖추십시오.

더 교활한 문제는 const 원래 언어가 아니었다는 것입니다.추가 기능으로는 적합하지 않습니다.처음에는 위의 규칙에서와 같이 "이것을 바꾸지 않을 것입니다"와 "이것은 수정할 수 없다"는 두 가지 의미가 있습니다.하지만 그 이상으로 위험할 수도 있습니다.예를 들어,이 코드를 컴파일하고 실행하면 (컴파일러/옵션에 따라) 실행할 때 충돌 할 수 있습니다.

const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';

strchr 반환합니다 char* 아니 const char*.호출 매개변수는 다음과 같습니다.const 그것은 해야 한다 깁스 호출 매개변수 char*.이 경우 실제 읽기 전용 저장 속성을 제거합니다. 편집하다:- 이는 일반적으로 읽기 전용 메모리의 변수에 적용됩니다.'ROM'이란 물리적 ROM뿐만 아니라 일반적인 OS에서 실행되는 프로그램의 코드 섹션에서 발생하는 쓰기 금지된 모든 메모리를 의미합니다.

많은 표준 라이브러리 함수가 동일한 방식으로 작동하므로 주의하세요.너가 가질 때 진짜 상수(예:ROM에 보관) 당신은 그들의 콘트로스를 잃지 않도록 매우 조심해야합니다.

다른 팁

Generally in any programming language its recommended to use const or the equivalent modifier since

  • It can clarify to the caller that what they passed in is not going to change
  • Potential speed improvements since the compiler knows for certain it can omit certain things that are only relevant if the parameter can change
  • Protection from yourself accidentally changing the value

In agreement with TheLQ's statements:

When working with a team of programmers declaring const is a good way of indicating that said variable shouldn't be modified, or just for reminding yourself in large projects. It's useful in that sense, and can save many headaches.

Yes, it's basically the TheLQ's answer.

Is a security measure for the programmer so you don't modify a variable, and to not call functions that may modify them. In an array or structure the const specifier indicates that the values of their contents won't be modified, and even the compiler will not allow you to do so. You still can easily change the value of the variable with just a cast however.

In what I have usually see, it's mostly used to add constant values in code, and to indicate that the array or structure won't be modified if you call a particular function. This last part is important, because when you call a function that WILL modify your array or structure, you may want to keep the original version, so you create a copy of the variable and then pass it to function. If that is not the case, you don't require the copy, obviously, so for example you can change,

int foo(Structure s);

to

int foo(const Structure * s);

and not getting the copy overhead.

Just to add, note that C has particular rules with the const specifier. For example,

int b = 1;
const int * a = &b;

is not the same as

int b = 1;
int * const a = &b;

The first code won't allow you to modify a. In the second case, the pointer is constant but its contents is not, so the compiler will allow you to say * a = 3; without a compiler error, but you can't make a to be a reference to another thing.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 softwareengineering.stackexchange
scroll top