[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 컴파일러는 기본적으로 경고를 발행합니다.