당신은 C 선언을 어떻게 읽습니까?
저는 몇 가지 방법을 들어보았지만, 어떤 방법도 고수하지 않았습니다.개인적으로 저는 C에서 복잡한 유형을 피하고 구성 요소 유형으로 나누려고 노력합니다.
저는 현재 소위 '3성 프로그래머'의 레거시 코드를 유지해야 하는 상황에 직면해 있으며, ***code[][]의 일부를 읽는 데 어려움을 겪고 있습니다.
복잡한 C 선언을 어떻게 읽습니까?
이 기사에서는 수동으로 C 선언을 읽고 싶거나 필요한 경우 C 선언을 읽을 수 있는 비교적 간단한 7가지 규칙을 설명합니다. http://www.ericgiguere.com/articles/reading-c-declarations.html
- 식별자를 찾습니다.이것이 당신의 출발점입니다.종이에 "식별자를 다음으로 선언"이라고 적습니다.
- 오른쪽을 보세요.아무것도 없거나 오른쪽 괄호 ")가 있으면 4단계로 이동합니다.
이제 배열(왼쪽 괄호) 또는 함수(왼쪽 괄호) 설명자에 배치됩니다.일치하지 않는 오른쪽 괄호 또는 선언자의 끝(초기화를 위한 세미콜론 또는 "=")으로 끝나는 순서가 있을 수 있습니다.각 설명자에 대해 왼쪽에서 오른쪽으로 읽습니다.
- "[]" 배열이 비어 있으면 "array of"라고 씁니다.
- 크기가 있는 배열인 경우 "array size of"라고 적으십시오.
- 함수(")인 경우 "함수 반환"이라고 씁니다.
일치하지 않는 괄호 또는 선언자의 끝에서 중지합니다.
- 시작 위치로 돌아가서 왼쪽을 봅니다.아무것도 없거나 왼쪽 괄호(",")가 있으면 6단계로 이동합니다.
- 이제 포인터 설명자 "*"에 배치되었습니다.왼쪽에는 일치하지 않는 왼쪽 괄호("") 또는 선언자의 시작으로 끝나는 일련의 순서가 있을 수 있습니다.각 포인터 설명자에 대해 오른쪽에서 왼쪽으로 "point to"를 기록합니다.일치하지 않는 괄호 또는 선언자의 시작 부분에서 중지합니다.
- 이때 괄호로 묶인 식을 사용하거나 완전한 선언자를 사용할 수 있습니다.괄호로 묶인 표현식이 있으면 이 표현식을 새 시작점으로 간주하고 2단계로 돌아갑니다.
- 형식 지정자를 적습니다.이제 그만.
당신이 도구를 하는 것이 , 저는 하는 것에 합니다.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의 난해한 선언"이라는 이름이 붙어 있습니다.
이렇게 구성된 유형의 각 개체에 대해 배열 인덱스, 함수 호출, 포인터의 방향 연산자 사용 등의 기본 개체를 언급하는 방법이 이미 있었습니다.유추적 추론은 이름이 일반적으로 나타나는 표현 구문의 이름을 미러링하는 선언 구문으로 이어졌습니다.따라서,
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
'programing' 카테고리의 다른 글
Vue 2의 모든 탭에서 업데이트될 때 다양한 탭 간에 반응 상태가 동일하게(업데이트되지 않음) 유지되기를 원합니다. (0) | 2023.06.29 |
---|---|
스프링 부트에서 콘솔 로깅을 비활성화하는 방법은 무엇입니까? (0) | 2023.06.29 |
matplotlib에서 하위 그림 사이의 간격을 제거하는 방법 (0) | 2023.06.29 |
Oracle에서 인덱스를 확인하는 방법 (0) | 2023.06.29 |
동일한 MongoDB 업데이트에서 $push 및 $set (0) | 2023.06.29 |