programing

정의보다 상수를 선호할까요?

firstcheck 2022. 7. 26. 00:24
반응형

정의보다 상수를 선호할까요?

C에서 정의보다 상수를 선호할까요?최근에 코드를 많이 읽었는데, 모든 예에서 정의를 많이 사용하고 있습니다.

아니요. 일반적으로 이름 상수를 작성하기 위해 C에서 const-qualified 개체를 사용하면 안 됩니다.C에서 이름 있는 상수를 작성하려면 두 매크로 중 하나를 사용해야 합니다.#defineenums를 참조해 주세요.상수가 점에 C는 .(는 이 점에서 다릅니다.), C는 C++입니다.

C 언어에서 상수 및 상수 표현개념은 C++와 매우 다르게 정의된다.C 상수는 다음과 같은 리터럴 값을 의미합니다.123여기 C에 있는 상수의 몇 가지 예가 있다.

123
34.58
'x'

C의 상수는 상수식을 작성하는 데 사용할 수 있습니다.그러나 모든 유형의 상수 수식 개체는 C의 상수가 아니므로 상수 표현식에 사용할 수 없으므로 상수 표현이 필요한 경우에는 상수 수식 개체를 사용할 수 없습니다.

예를 들어, 다음은 상수가 아닙니다.

const int C = 123; /* C is not a constant!!! */

그리고 이상부터C에 파일 내의 하는 데 할 수 .파일 범위에서 어레이 유형을 선언하는 데 사용할 수 없습니다.

typedef int TArray[C]; /* ERROR: constant expression required */

케이스 라벨로 사용할 수 없습니다.

switch (i) {
  case C: ; /* ERROR: constant expression required */
}

비트 필드 폭으로 사용할 수 없습니다.

struct S {
  int f : C; /* ERROR: constant expression required */
};

저장 기간이 정적인 개체의 이니셜라이저로 사용할 수 없습니다.

static int i = C; /* ERROR: constant expression required */

열거 이니셜라이저로 사용할 수 없습니다.

enum {
  E = C /* ERROR: constant expression required */
};

즉, 상수가 필요한 곳에서는 사용할 수 없습니다.

이것은 직관에 반하는 것처럼 보일 수 있지만, C 언어는 이렇게 정의됩니다.

이 많이 .#define사용 중인 코드에 있습니다.C는 항상 한정되어 있습니다.으로 ' 쓸모가 없기 으로 '상수'를 .C 언어에서는 기본적으로 사용하지 않을 수 없습니다.#define에넘스

물론 일정한 수식 오브젝트가 기능하는 경우(즉, 원하는 대로 동작하는 경우)에는 스코프와 타이핑이 되어 있기 때문에 여러 면에서 매크로보다 우수합니다.해당되는 경우 이러한 개체를 선호해야 하지만 일반적으로 위의 제한 사항을 고려해야 합니다.

는 상수로 이 좋다.define 몇 가지. 몇 가지 장점이 있습니다.

  • 안전성을 입력하세요.C가 약한 타입의 언어인 반면,define타입의 안전성이 모두 상실되어 컴파일러가 문제를 검출할 수 있게 됩니다.

  • 디버깅의 용이성디버거를 통해 상수의 값을 변경할 수 있습니다.define는, 테스트나 테스트의 목적으로 값을 변경하는 경우는, 코드로 자동적으로 실제의 값으로 변경됩니다.

이 질문은 C에만 해당되지만 알아두면 좋을 것 같습니다.

#include<stdio.h>
int main() {
    const int CON = 123;
    int* A = &CON;
    (*A)++;
    printf("%d\n", CON);  // 124 in C
}

C에서는 동작하지만 C++에서는 동작하지 않는다.

「 」를 하는 #define코드를 망치지 않기 위해서입니다.C++로 하다

여기 많은 분들이 'C++ 스타일' 조언을 해주시네요.C++는 C++는 C++는 C++는 C++는 C++로 하다.주관적인 (그것이 주관적인지 아닌지는)라고 말하는 사람들const때로는 두 언어에서 다른 무언가가 옳다는 것을 의미하기도 한다.

하지만 이것들은 대부분 사소한 점이고, 개인적으로 어느 쪽으로든 가는 것은 비교적 사소한 결과라고 생각합니다.그건 스타일의 문제이고, 다른 그룹의 사람들이 당신에게 다른 답을 줄 거라고 생각해요.

용법이나 용법, 가장 문체의 ,인 용법이 사용되고 있습니다#defineC코드에서 C++섬을 사용하는 것은 C코더의 좁은 세그먼트에서는 이상하게 보일 수 있습니다.(나를 포함해서, 그것이 나의 편견입니다.)

어느 도 두에서 "하지 않았다는 것에. "정수를 사용하세요. 정수 상수 그룹에 맞는다면, 중간 솔루션을 사용하십시오.enum.

제가 잘못 사용하고 있는 것 같습니다만, 적어도 gcc에서는 대소문자에 상수를 사용할 수 없습니다.

const int A=12;
switch (argc) {
    case A:
    break;
}

define은 다양한 용도로 사용할 수 있습니다(매우 느슨함).변수를 정의하고 더 많은 작업을 수행할 수 있는 const로 대체할 수 있는 경우에는 피해야 합니다.

다음과 같은 경우 정의를 사용해야 합니다.

  • 지시 스위치
  • 소스라인 대체
  • 코드 매크로

예를 들어 define over const를 사용해야 하는 경우 버전 번호3에서 사용할 수 없는 메서드를 버전4에 포함시키고 싶은 경우

#define VERSION 4
...

#if VERSION==4
   ................
#endif 

상수보다 더 오래 언어의 일부였기 때문에 많은 오래된 코드에서는 코드 작성 시 작업을 완료하는 유일한 방법이 정의되어 있습니다.좀 더 최근의 코드에 대해서는 단순히 프로그래머의 습관의 문제일 수 있습니다.

상수에는 값뿐만 아니라 유형도 있으므로 값이 유형을 갖는 것이 적절한 경우에는 선호되지만 유형이 없는 경우(또는 다형식)에는 선호되지 않습니다.

되지 않은 이라면, 약약프 if if if if if if if를 사용합니다.#define을 둘 를 사용할 수 #define kGUISpace 20.

"C" 코드의 상수 대신 DEFINE을 사용하는 AndreyT에 의해 제시된 훌륭한 이유 외에도 DEFINE을 사용하는 또 다른 실용적인 이유가 있습니다.

DEFAINE은 정의된 상수를 찾을 수 있는 (.h) 헤더 파일에서 쉽게 정의하고 사용할 수 있습니다.헤더 파일에서 const를 정의하는 것은 그리 쉬운 일이 아닙니다.이것은 중복 정의 등을 피하기 위한 더 많은 코드입니다.

또한 "typesafe" 인수는 대부분의 컴파일러가 문자열과 int를 할당하는 등의 명백한 오류를 인식하거나 정수를 플로트에 할당하는 등 약간의 불일치에 대해 "올바른 작업을 수행합니다"라는 의미입니다.

매크로(정의)는 프리프로세서에서 사용할 수 있지만 컴파일 시 상수는 사용할 수 없습니다.

매크로가 유효한 범위(및 매크로가 아닌 경우 #error 또는 #치명적) 내에 있는지 확인하기 위해 컴파일 시간 체크를 수행할 수 있습니다.매크로가 아직 정의되지 않은 경우 기본값을 사용할 수 있습니다.어레이 크기의 매크로를 사용할 수 있습니다.

컴파일러는 상수에 비해 매크로에 최적화할 수 있습니다.

const int SIZE_A = 15;
#define SIZE_B 15

for (i = 0; i < SIZE_A + 1; ++i);    // if not optimized may load A and add 1 on each pass
for (i = 0; i < SIZE_B + 1; ++i);    // compiler will replace "SIZE_B + 1" with 16

대부분의 작업은 뛰어난 최적화 컴파일러를 탑재하지 않은 임베디드 프로세서를 사용하고 있습니다.아마도 gcc는 SIZE_A를 어떤 최적화 수준에서 매크로처럼 취급할 것입니다.

언급URL : https://stackoverflow.com/questions/2308194/shall-i-prefer-constants-over-defines

반응형