구조물에 대한 포인터의 정의를 입력
나는 다음과 같은 코드를 발견했습니다.
typedef struct {
double x;
double y;
double z;
} *vector;
이것이 유효한 유형 정의입니까?코드가 컴파일되고 정상적으로 실행됩니다.그냥 이게 일반적인 관행인지 궁금했어요.
확실히 유효합니다.일반적으로 두 가지 유형을 함께 정의하여 이 방법을 최대한 활용할 수 있습니다.
typedef struct
{
int a;
int b;
} S1, *S1PTR;
여기서 S1은 구조체이고 S1PTR은 이 구조체에 대한 포인터입니다.
네.하지만 나쁜 스타일에 대해서는 저의 생각입니다.구조체의 직접적인 선언이 아니라 포인터 유형의 직접적인 선언입니다.코드를 읽을 때는 주어진 변수나 매개 변수가 포인터라는 정보(그리고 배열의 경우는 그보다 작은 정도)가 매우 중요한 난독화입니다.
코드를 검토할 때 어떤 기능이 부작용을 일으킬 수 있는지 아닌지를 언뜻 보기 어려운 경우가 많습니다.사용된 유형이 이 정보를 숨기면 독자에게 암기 부담을 가중시킵니다.
int do_fancy(vector a, vector b);
아니면
int do_fancy(vector *a, vector *b);
첫번째 경우에 나는 그 함수가 a나 b의 내용을 바꿀지도 모른다는 것을 쉽게 놓칠 수 있습니다.곧 경고를 받게 될 겁니다.
그리고 실제로 코드를 작성할 때는 직접 작성하는 것도 알고 있습니다.a->x
그리고 컴파일러가 나에게 말하라고 하지 않습니다.error: request for member
구조나 조합이 아닌 것에서 x'.
개인적인 취향처럼 보이지만, 많은 외부 코드를 사용하여 작업한 결과, 변수의 간접 수준을 인식하지 못하는 것은 매우 짜증나는 일이라고 장담할 수 있습니다.이것이 제가 C++ 참조를 싫어하는 이유이기도 합니다. (Java에서는 모든 개체가 참조로 전달되는 것이 아니라 일관성이 있습니다.) 그리고 Microsoft의 참조를 싫어합니다.LPCSTR
일종의 활자.
네, 유효합니다.더 많은 "보안"이 필요하다면 할 수도 있습니다.
typedef struct vector_{
double x;
double y;
double z;
} *vector;
그러면 둘 다 사용할 수 있습니다.
struct vector_ *var;
vector var;
하지만 엔딩 세미콜론을 잊지 마세요.
typedef만 사용한다는 것은 그런 식으로 이름을 지었다는 것을 의미합니다.그렇지 않으면 익명이 될 겁니다
그것은 유효합니다. 그것은 새로운 유형을 정의하는 것입니다.@알렉스가 말했듯이, 타입과 포인터 타입을 정의하는 것이 유용할 것입니다.
사용하는 것만으로도 더 많은 포인터를 만들 수 있습니다.
S1PTR ptr1, ptr2, ptr3, ...;
대신에
S1 *ptr1, *ptr2, *ptr3, ...;
예, 위의 답변에서 설명한 대로 유효합니다.작은 제안이지만, 태그 이름도 함께 제공해주시면 좋을 것 같습니다. 아래와 같습니다.이렇게 하면 일부 IDE가 코드를 더 잘 구문 분석하는 데 도움이 됩니다.
typedef struct vactor_tag {
double x;
double y;
double z;
} *vector;
예...벡터 구조나 포인터를 선언할 때마다 'struct'라는 단어를 계속 입력해야 하는 어려움을 saves합니다.
언급URL : https://stackoverflow.com/questions/1543713/c-typedef-of-pointer-to-structure
'programing' 카테고리의 다른 글
jQuery의 요소 총 너비(패딩 및 테두리 포함) (0) | 2023.09.26 |
---|---|
Excel 시트의 행 높이를 프로그래밍 방식으로 변경 (0) | 2023.09.26 |
jQuery: 코드를 실행하지 않고 1초 대기/지연 (0) | 2023.09.26 |
maxscale master slave 연결 풀에서 유효한 연결 확인 (0) | 2023.09.26 |
바인딩되지 않은 RestTemplate로 인해 Spring-BootRestClientTest가 MockRestServiceServer를 올바르게 자동 구성하지 않음 (0) | 2023.09.26 |