我必须定义一个24位的数据类型。我使用char[3]来表示类型。我可以类型定义字符[3]类型24?我在一个代码示例中尝试了它。我输入typedef char[3] type24;在我的头文件中。编译器并没有抱怨。但是当我在我的C文件中定义一个函数void foo(type24 val){}时,它确实抱怨了。我想能够定义函数,如type24_to_int32(type24 val)而不是type24_to_int32(char值[3])。


当前回答

从R . .的回答:

然而,这可能是一个非常糟糕的主意,因为结果类型 是数组类型,但它的用户不会看到它是数组类型。 如果用作函数参数,它将通过引用传递,而不是通过 Value,那么它的sizeof就会是错误的。

没有看到它是一个数组的用户很可能会写这样的东西(这是失败的):

#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

其他回答

类型定义为

typedef char type24[3];

然而,这可能是一个非常糟糕的主意,因为结果类型是一个数组类型,但它的用户不会看到它是一个数组类型。如果作为函数参数使用,它将通过引用传递,而不是通过值,并且它的sizeof将是错误的。

一个更好的解决办法是

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

您可能还希望使用unsigned char而不是char,因为后者具有实现定义的签名性。

从R . .的回答:

然而,这可能是一个非常糟糕的主意,因为结果类型 是数组类型,但它的用户不会看到它是数组类型。 如果用作函数参数,它将通过引用传递,而不是通过 Value,那么它的sizeof就会是错误的。

没有看到它是一个数组的用户很可能会写这样的东西(这是失败的):

#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

要正确地将数组类型用作函数实参或模板形参,请创建一个struct而不是typedef,然后在结构中添加一个操作符[],这样您就可以保持数组类函数,如下所示:

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

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

基于已接受的答案,多维数组类型(即固定长度数组的固定长度数组)不能声明

typedef char[M] T[N];  // wrong!

相反,中间1D数组类型可以声明并在接受的答案中使用:

typedef char T_t[M];
typedef T_t T[N];

或者,T可以在一个单独的(可以说是令人困惑的)语句中声明:

typedef char T[N][M];

它定义了一种类型的N个数组的M字符(注意顺序,这里)。

你想要的

typedef char type24[3];

C类型声明在这方面很奇怪。如果要声明该类型的变量,则将类型放置在变量名所在的位置。