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에서 값으로 배열을 함수 매개 변수로 전달할 수 없습니다.
You can put the array in a struct:
typedef struct type24 {
char byte[3];
} type24;
and then pass that by value, but of course then it's less convenient to use: x.byte[0]
instead of x[0]
.
Your function type24_to_int32(char value[3])
actually passes by pointer, not by value. It's exactly equivalent to type24_to_int32(char *value)
, and the 3
is ignored.
If you're happy passing by pointer, you could stick with the array and do:
type24_to_int32(const type24 *value);
This will pass a pointer-to-array, not pointer-to-first-element, so you use it as:
(*value)[0]
I'm not sure that's really a gain, since if you accidentally write value[1]
then something stupid happens.
To use the array type properly as a function argument or template parameter, make a struct instead of a typedef, then add an operator[]
to the struct so you can keep the array like functionality like so:
typedef struct type24 {
char& operator[](int i) { return byte[i]; }
char byte[3];
} type24;
type24 x;
x[2] = 'r';
char c = x[2];
Here's a short example of why typedef array can be confusingly inconsistent. The other answers provide a workaround.
#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);
}
This produces the output
sizeof(a) is 8
sizeof(b) is 3
because type24 as a parameter is a pointer. (In C, arrays are always passed as pointers.) The gcc8 compiler will issue a warning by default, thankfully.
참고URL : https://stackoverflow.com/questions/4523497/typedef-fixed-length-array
'development' 카테고리의 다른 글
__construct 함수는 무엇입니까? (0) | 2020.05.13 |
---|---|
Makefile 대상에서 Bash 구문을 사용하려면 어떻게해야합니까? (0) | 2020.05.12 |
부호있는 숫자에 대해 부호와 크기보다 2의 보수를 선호하는 이유는 무엇입니까? (0) | 2020.05.12 |
Unix에서 특정 확장자로 끝나지 않는 파일 이름을 찾으십니까? (0) | 2020.05.12 |
Angular JS : 범위가있는 지시문 컨트롤러가 이미있을 때 지시문 링크 기능이 필요한 것은 무엇입니까? (0) | 2020.05.12 |