programing

당신은 C 선언을 어떻게 읽습니까?

css3 2023. 6. 29. 20:18

당신은 C 선언을 어떻게 읽습니까?

저는 몇 가지 방법을 들어보았지만, 어떤 방법도 고수하지 않았습니다.개인적으로 저는 C에서 복잡한 유형을 피하고 구성 요소 유형으로 나누려고 노력합니다.

저는 현재 소위 '3성 프로그래머'의 레거시 코드를 유지해야 하는 상황에 직면해 있으며, ***code[][]의 일부를 읽는 데 어려움을 겪고 있습니다.

복잡한 C 선언을 어떻게 읽습니까?

이 기사에서는 수동으로 C 선언을 읽고 싶거나 필요한 경우 C 선언을 읽을 수 있는 비교적 간단한 7가지 규칙을 설명합니다. http://www.ericgiguere.com/articles/reading-c-declarations.html

  1. 식별자를 찾습니다.이것이 당신의 출발점입니다.종이에 "식별자를 다음으로 선언"이라고 적습니다.
  2. 오른쪽을 보세요.아무것도 없거나 오른쪽 괄호 ")가 있으면 4단계로 이동합니다.
  3. 이제 배열(왼쪽 괄호) 또는 함수(왼쪽 괄호) 설명자에 배치됩니다.일치하지 않는 오른쪽 괄호 또는 선언자의 끝(초기화를 위한 세미콜론 또는 "=")으로 끝나는 순서가 있을 수 있습니다.각 설명자에 대해 왼쪽에서 오른쪽으로 읽습니다.

    • "[]" 배열이 비어 있으면 "array of"라고 씁니다.
    • 크기가 있는 배열인 경우 "array size of"라고 적으십시오.
    • 함수(")인 경우 "함수 반환"이라고 씁니다.

    일치하지 않는 괄호 또는 선언자의 끝에서 중지합니다.

  4. 시작 위치로 돌아가서 왼쪽을 봅니다.아무것도 없거나 왼쪽 괄호(",")가 있으면 6단계로 이동합니다.
  5. 이제 포인터 설명자 "*"에 배치되었습니다.왼쪽에는 일치하지 않는 왼쪽 괄호("") 또는 선언자의 시작으로 끝나는 일련의 순서가 있을 수 있습니다.각 포인터 설명자에 대해 오른쪽에서 왼쪽으로 "point to"를 기록합니다.일치하지 않는 괄호 또는 선언자의 시작 부분에서 중지합니다.
  6. 이때 괄호로 묶인 식을 사용하거나 완전한 선언자를 사용할 수 있습니다.괄호로 묶인 표현식이 있으면 이 표현식을 새 시작점으로 간주하고 2단계로 돌아갑니다.
  7. 형식 지정자를 적습니다.이제 그만.

당신이 도구를 하는 것이 , 저는 하는 것에 합니다.cdecl: http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

저는 보통 가끔 '오른손 시계방향 규칙'이라고 불리는 것을 사용합니다.그건 이런 식이다:

  • 식별자부터 시작합니다.
  • 바로 오른쪽으로 가세요.
  • 그런 다음 시계 방향으로 이동하고 왼쪽으로 오십시오.
  • 시계 방향으로 이동하고 오른쪽으로 오십시오.
  • 선언이 완전히 구문 분석되지 않은 경우 이 작업을 수행합니다.

다음과 같은 추가 메타 규칙이 있습니다.

  • 괄호가 있으면 이동하기 전에 각 괄호 수준을 완료합니다.

여기서 '가려고'와 '움직이고'는 그 곳에서 기호를 읽는 것을 의미합니다.이에 대한 규칙은 다음과 같습니다.

  • *에 대한 포인터.
  • () return
  • (int, int)는 두 의 int를 합니다.
  • int,char- 기타▁- -int,char 타기.
  • []의 배열
  • [10].
  • 기타.

를 들면, 를들어예,,int* (*xyz[10])(int*, char)다음과 같이 읽힙니다.

xyz는

열 개의 배열

에 대한 지침.

함수는 int*와 char를 취하고 반환합니다.

인트*

한 단어: cdecl

젠장, 15초 차이로 졌어요!

Cdecl(및 C++decl)은 C(또는 C++) 유형 선언을 인코딩하고 디코딩하기 위한 프로그램입니다.

http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

C를 할 때 "cdecl"이라는 프로그램을 사용했습니다.cutils 또는 cdecl 패키지의 Ubuntu Linux에 있는 것으로 보이며, 다른 곳에서 사용할 수 있을 것입니다.

cdecl은 명령줄 인터페이스를 제공하므로 다음과 같이 시도해 보겠습니다.

cdecl> explain int ***c[][]
declare c as array of array of pointer to pointer to pointer to int

다른 예

explain int (*IMP)(ID,SEL) 
declare IMP as pointer to function (ID, SEL) returning int

그러나 책 "C Deep Secrets"에는 그것에 대한 전체 장이 있으며, "C의 난해한 선언"이라는 이름이 붙어 있습니다.

"C 언어의 발전"에서 조명 부분을 발견했습니다.

이렇게 구성된 유형의 각 개체에 대해 배열 인덱스, 함수 호출, 포인터의 방향 연산자 사용 등의 기본 개체를 언급하는 방법이 이미 있었습니다.유추적 추론은 이름이 일반적으로 나타나는 표현 구문의 이름을 미러링하는 선언 구문으로 이어졌습니다.따라서,

int i, *pi, **ppi;

정수, 정수에 대한 포인터, 정수에 대한 포인터를 선언합니다.이러한 선언의 구문은 i, *pi 및 **ppi가 모두 식에 사용될 때 int 유형을 생성한다는 관찰을 반영합니다.유사하게,

int f(), *f(), (*f)();

정수를 반환하는 함수, 정수를 반환하는 함수, 정수를 반환하는 함수의 포인터를 선언합니다.

int *api[10], (*pai)[10];

정수에 대한 포인터 배열과 정수에 대한 포인터 배열을 선언합니다.이러한 모든 경우에 변수의 선언은 선언의 머리에 이름이 붙은 형식의 표현식에서 사용되는 것과 유사합니다.

기반 버전의 cdecl도 꽤 매끄럽습니다.

일반적인 가독성 문제에는 함수 포인터와 배열이 실제로 포인터이며, 다차원 배열이 실제로 단일 차원 배열(실제 포인터)이라는 사실이 포함됩니다.도움이 되길 바랍니다.

어쨌든, 여러분이 선언문을 이해할 때마다, 아마도 여러분은 다음 사람이 더 읽기 쉽게 하기 위해 그것들을 단순화하는 방법을 찾을 수 있을 것입니다.

자동화 솔루션은 cdecl입니다.

일반적으로 변수를 사용하는 방식으로 변수를 선언합니다.예를 들어 다음과 같이 포인터 경로의 참조를 취소합니다.

char = * p

비슷한 방식으로 선언합니다.

char * p;

털이 많은 함수 포인터도 마찬가지입니다.f를 "int로 포인터를 반환하는 함수 포인터"로 오래된 것으로 선언하고, 재미를 위해 외부 선언을 선언합니다.함수에 대한 포인터이므로 다음과 같이 시작합니다.

외부 * f();

포인터를 int로 되돌리기 때문에 앞 어딘가에

externent * * f(); // XXX 아직 없음

이제 올바른 연관성은 무엇입니까?저는 기억이 안 나요, 그러니 괄호를 사용하세요.

외부(int *)(* f)();

사용 방법을 선언합니다.

언급URL : https://stackoverflow.com/questions/89056/how-do-you-read-c-declarations