带指针的typedef声明

时间:2016-11-21 06:18:12

标签: c pointers syntax typedef

本周末学习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文件中的含义是什么?

1 个答案:

答案 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;

是一样的。