development

typedef 고정 길이 배열

big-blog 2020. 5. 12. 19:14
반응형

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

반응형