programing

C에 정원이 있나요?

luckcodes 2022. 12. 27. 21:57

C에 정원이 있나요?

이 질문은 순진할 수 있지만,

  • 있습니까?const【C】
  • 어느 버전부터요?
  • 및?constC++는?

++는 C++에 차이는 .const외에 이후)에서는 함수 가 C(C99 이후)로 할 수 .

void foo(int a[const]);

와 동등하다.

void foo(int *const a);

선언.C++는 이러한 구문을 지원하지 않습니다.

의미적 차이도 존재한다. @한 바와 C @Ben Voigt에서는 C @Ben Voigt입니다.const에서는 일정한. 에서는 c를 사용할. c는 a, c는 a를 사용할 수 없습니다.const intcase비 VLA 어레이 선언에서는 비트필드 폭 또는 어레이 크기로 라벨이 표시됩니다(이 모든 것은 C++에서 가능합니다).ㅇㅇㅇㅇ.const오브젝트에는 기본적으로 C에 외부 링크가 있습니다(C++의 내부 링크).

벤이 언급하지 않은 의미적 차이가 적어도 하나 더 있습니다.C++ 언어의 상수-수정성 규칙은 다음과 같은 표준 변환을 지원합니다.

int **pp = 0;
const int *const *cpp = pp; // OK in C++

int ***ppp = 0;
int *const *const *cppp = ppp; // OK in C++

이러한 초기화는 C에서 부정합니다.

int **pp = 0;
const int *const *cpp = pp; /* ERROR in C */

int ***ppp = 0;
int *const *const *cppp = ppp; /* ERROR in C */

일반적으로 멀티레벨 포인터를 취급할 때 C++는 const-qualification을 최상위 레벨까지 추가하는 한 어떤 간접 깊이에서도 const-qualification을 추가할 수 있다고 합니다.

C에서는 최상위 포인터가 가리키는 유형에만 const-qualification을 추가할 수 있으며 자세한 내용은 추가할 수 없습니다.

int **pp = 0;
int *const *cpp = pp; /* OK in C */

int ***ppp = 0;
int **const *cppp = ppp; /* OK in C */

동일한 기본 일반 원리의 또 다른 표현은 const-correctness 규칙이 C 및 C++의 배열과 함께 작동하는 방법입니다.C++에서는 다음을 수행할 수 있습니다.

int a[10];
const int (*p)[10] = &a; // OK in C++

C에서 동일한 작업을 시도하면 오류가 발생합니다.

int a[10];
const int (*p)[10] = &a; /* ERROR in C */

첫 번째 두 가지 질문에 대한 답변은 다음과 같습니다: Const in C

, , 그, 그, 그, 그, 그, 그, yes, yes, yes, yes, yes, yes, yes, yes, yes, yes, yes, yes, yes, between, between, between, between, , constC++라고 하다.

  • 에서는 C++입니다.const적절한 유형의 변수는 정수 표현식이며(이 변수의 이니셜라이저가 컴파일 시간 상수 표현인 경우), 배열 경계와 같이 필요한 컨텍스트 및 열거 정의에서 사용할 수 있습니다.C에서는 그렇지 않고 있을 수 없습니다.

  • 에서는 C++입니다.const으로 「」가 붙습니다.static을 사용법C에서는 이러한 변수에는 외부 링크가 있으며 링크 시 중복 정의 오류가 발생합니다.

아, 아, 아, 아, 아, 게 있어요.const키워드를 지정합니다.1989년

호환성에 관한 Harbison & Steel 제5판 패러그래프는 다음과 같습니다.

유형 한정자를 가진 최상위 선언 const그러나 명시적인 스토리지 클래스는 존재하지 않습니다. staticC++는externC. 호환성을 유지하려면 상위 수준을 검토하십시오. const선언 및 명시적 스토리지 클래스를 제공합니다.C++는 C++입니다.const카아아아아아아아

ㅇㅇ.constANSI C(C89)는 ANSI C입니다.

이것은, 「C프로그래밍 언어(2판), Kernighan & Ritchie」(1988년 출판)의 제 카피에도 분명히 기재되어 있습니다.

관련 발췌:

const ★★★★★★★★★★★★★★★★★」volatileANSI를 사용하다★★★의 const는 읽기 전용 메모리에 배치될 수 있는 오브젝트를 방송하는 것으로, 최적화 가능성을 높이는 것입니다.

다른 두 가지 차이점:

  • const arraytype: (요약:typedef int A[1]; const A a = { 0 };)는 C++에서는 일정한 배열 유형(http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#112 및 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1059 )을 지정합니다(및 그 요소도 한정되어 있습니다).단, C에서는 요소가 한정되어 있는 비표준 배열 유형을 지정합니다.

  • const const), 으로 「C99」(C89 「C++」(C++」)만을 할 수 ).const을 사용법constC99 c c c c c c

ㅇㅇ.constC89 터 C c c c c c c c

다음은 C에서 const 키워드의 동작에 대한 좋은 읽기입니다.

C의 의미는 C++와 다릅니다.예를들면,

unsigned const a = 10;
unsigned A[a];

C++에서는 유효하지만 C에서는 유효하지 않습니다.

아, 아, 아, 아, 이런 게 const키워드를 지정합니다.C90 ★★★★★★★★★★★★★★★★★★★」

구문론적으로는 C++와 같은 장소에서 발생할 수 있습니다.의미론적으로, IIRC는 좀 느슨합니다.

ESR에 따르면constANSI C 초안 제안 표준에 추가되었습니다.에릭 지그레가 1987년에 쓴 ANSI C의 요약은 그것을 확인시켜 준다.

이것은 초안 자체와 유사합니다. - "3.5.3 유형 한정자"를 검색합니다.

C에는 "const" 키워드가 있는데, 오랫동안 그래왔습니다.변수가 "상수"로 지정된 경우 변수에 대한 쓰기가 금지됩니다.

또한 일부 환경에서는 "상수"로 선언된 변수가 다른 변수와 다른 데이터 세그먼트에 있을 수 있습니다.이 데이터 세그먼트는 하드웨어 쓰기 보호를 제공할 수 있으며 임베디드 시스템의 경우 RAM이 아닌 ROM 또는 플래시 메모리에 저장할 수 있습니다(예를 들어 128KB 플래시와 3.5KB RAM, 2KB ROM과 96바이트 RAM 등 ROM 또는 플래시가 RAM보다 훨씬 많은 프로세서에서 매우 중요한 차이입니다).

컴파일러는 일반적으로 "정수" 값이나 값과 관련된 식에 대해 어떠한 추론도 하지 않습니다.const char foo [ ]= "Hello";"라고 말한 후 나중에 foo[1]를 참조하면 컴파일러는 foo[]가 저장되어 있는 모든 곳에서 값을 로드하고 로드된 값을 사용합니다.경우에 따라서는 컴파일된 코드 이미지에서 값을 패치할 수 있지만 코드만 낭비하는 경우도 있습니다.

숫자를 컴파일 시간 "대체 가능" 상수로 정의하려면 적어도 정수 상수의 경우 "enum"을 사용하는 것이 가장 좋습니다.예를 들어 "enum {wozle=19;}"은 코드 전체에서 "wozle" 대신 19가 대체됩니다.텍스트 치환과는 달리 열거 선언은 적절한 범위 규칙을 따릅니다.

언급URL : https://stackoverflow.com/questions/5248571/is-there-const-in-c