[c] typedef 고정 길이 배열

24 비트 데이터 형식을 정의 char[3]해야합니다. 형식을 나타내는 데 사용 하고 있습니다. 에 typedef char[3]를 입력 할 수 있습니까 type24? 코드 샘플에서 시도했습니다. typedef char[3] type24;헤더 파일에 넣었습니다 . 컴파일러는 그것에 대해 불평하지 않았습니다. 그러나 void foo(type24 val) {}C 파일에 함수 를 정의했을 때 불평했습니다. type24_to_int32(type24 val)대신 과 같은 기능을 정의하고 싶습니다 type24_to_int32(char value[3]).



답변

typedef는

typedef char type24[3];

그러나 결과 유형이 배열 유형이기 때문에 이것은 매우 나쁜 생각 일 수 있지만 사용자에게는 그것이 배열 유형이라는 것을 알 수 없습니다. 함수 인수로 사용되면 값이 아닌 참조로 전달 sizeof되므로 잘못된 것입니다.

더 나은 해결책은

typedef struct type24 { char x[3]; } type24;

후자는 구현 정의 서명을 가지고 있기 때문에 아마 unsigned char대신에 사용하고 싶을 수도 있습니다 char.


답변

당신이 원하는

typedef char type24[3];

C 타입 선언은 그렇게 이상합니다. 해당 유형의 변수를 선언하는 경우 변수 이름의 위치를 ​​정확하게 입력하십시오.


답변

에서 R ..의 대답 :

그러나 결과 유형이 배열 유형이기 때문에 이것은 매우 나쁜 생각 일 수 있지만 사용자에게는 그것이 배열 유형이라는 것을 알 수 없습니다. 함수 인수로 사용되면 값이 아닌 참조로 전달되므로 크기가 잘못됩니다.

배열임을 알지 못하는 사용자는 다음과 같이 작성할 것입니다 (실패).

#include <stdio.h>

typedef int twoInts[2];

void print(twoInts *twoIntsPtr);
void intermediate (twoInts twoIntsAppearsByValue);

int main () {
    twoInts a;
    a[0] = 0;
    a[1] = 1;
    print(&a);
    intermediate(a);
    return 0;
}
void intermediate(twoInts b) {
    print(&b);
}

void print(twoInts *c){
    printf("%d\n%d\n", (*c)[0], (*c)[1]);
}

다음 경고와 함께 컴파일됩니다.

In function intermediate’:
warning: passing argument 1 of print from incompatible pointer type [enabled by default]
    print(&b);
     ^
note: expected int (*)[2]’ but argument is of type int **’
    void print(twoInts *twoIntsPtr);
         ^

그리고 다음과 같은 출력을 생성합니다.

0
1
-453308976
32767


답변

C에서 값으로 배열을 함수 매개 변수로 전달할 수 없습니다.

배열을 구조체에 넣을 수 있습니다.

typedef struct type24 {
    char byte[3];
} type24;

그런 다음 값으로 전달하지만 물론 다음 x.byte[0]대신 사용하는 것이 편리 하지 않습니다 x[0].

함수는 type24_to_int32(char value[3])실제로 값이 아닌 포인터를 통해 전달됩니다. 정확히와 동일 type24_to_int32(char *value)하고 3는 무시됩니다.

당신이 포인터에 의해 행복 통과를해서, 당신은 할 수 배열을 고수하고 수행

type24_to_int32(const type24 *value);

이것은 포인터에서 첫 번째 요소가 아닌 배열에 대한 포인터를 전달하므로 다음과 같이 사용하십시오.

(*value)[0]

실수로 쓴 value[1]다면 어리석은 일이 발생하기 때문에 그것이 실제로 이득인지 확신 할 수 없습니다 .


답변

배열 유형을 함수 인수 또는 템플릿 매개 변수로 올바르게 사용하려면 typedef 대신 구조체를 만든 다음 operator[]구조체에 추가 하여 구조체와 같은 기능을 유지할 수 있습니다.

typedef struct type24 {
  char& operator[](int i) { return byte[i]; }
  char byte[3];
} type24;

type24 x;
x[2] = 'r';
char c = x[2];


답변

다음은 typedef 배열이 혼동 될 수없는 간단한 예입니다. 다른 답변은 해결 방법을 제공합니다.

#include <stdio.h>
typedef char type24[3];

int func(type24 a) {
        type24 b;
        printf("sizeof(a) is %zu\n",sizeof(a));
        printf("sizeof(b) is %zu\n",sizeof(b));
        return 0;
}

int main(void) {
        type24 a;
        return func(a);
}

이것은 출력을 생성합니다

sizeof(a) is 8
sizeof(b) is 3

매개 변수로서 type24는 포인터이기 때문입니다. (C에서는 배열이 항상 포인터로 전달됩니다.) gcc8 컴파일러는 기본적으로 경고를 발행합니다.


답변