本周末学习C ANSI语言的特殊性并且是一项挑战。
在练习中,我有一个头文件,其中包含一些函数签名声明。
这引起了我的注意:
typedef struct image * Image;
我在我的.c文件中试过这个:
typedef struct {
char nbrMagique[10];
unsigned long imgLarg;
unsigned long imgHaut;
unsigned long imgSeuilMax;
unsigned long **imageMatrice;
} Image;
但在编译时不断出现错误:
imagePGM.c:22:3: erreur: conflicting types for ‘Image’
} Image;
所以我想因为我无法重新定义.c文件中的结构,我也无法触及标题。
并尊重" typedef struct image * Image;"在.h头文件中,我必须创建一个动态2维表并将指针*图像指向它吗?
我在反思中错过了一些东西吗?
但是,typdef的签名中的指针*在.h文件中的含义是什么?
答案 0 :(得分:3)
从typedef
的语义,章节§6.7.8,C11
文档,
在存储类说明符为
指定的类型typedef
的声明中,每个声明符定义一个 标识符是typedef名称,表示为标识符[...]
因此,基本上,typedef
用于为给定类型创建别名。
另外,要扩展,
typedef
声明不会引入新类型,只会引入一个 所指定类型的同义词。也就是说,在以下声明中:
typedef T type_ident;
type_ident D;
type_ident
被定义为具有声明指定类型的typedef
名称T
中的说明符(称为T
),D
中的标识符具有类型''derived-declaratortype- 列出T''。
在您的代码中,您尝试typedef
两个不同类型(即struct image *
和一个未命名的struct
)到同一个别名,这就是问题的原因。
解决方案:您不需要在typedef
文件中.c
结构声明,使用简单的声明,例如
struct image {
char nbrMagique[10];
unsigned long imgLarg;
unsigned long imgHaut;
unsigned long imgSeuilMax;
unsigned long **imageMatrice;
} ;
这就是说,一般来说,typedef
指针被认为是一种令人困惑的编码风格,这会降低可读性,恕我直言,避免使用类型指针。
关于部分
但是
*
签名中的指针typedef
是什么意思?
这意味着,新别名是指针类型。对于这种情况,
typedef struct image * Image;
两个
Image iPointer = NULL;
和
struct image * againIPointer = NULL;
是一样的。