2016-11-21 89 views
1

本周末学习C ANSI语言的特性,这是相当大的挑战。使用指针的typedef声明

在练习中,我有一个头文件,它有几个函数签名的声明。

这一个引起我的注意:

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头文件中,我必须创建一个动态二维表并将指针*图像指向它?

我是否错过了我的反思?

但是typdef签名中的指针*在.h文件中的含义是什么?

+2

您对'Image'做了两个不同的定义... ...其中一个是struct image *的typedef,另一个是未命名结构的typedef。您只能键入一次名称。也许你的意思是'struct image {......};'在你的c文件中 –

+0

我必须使用struct image * Image;肯定 我不能使用第二个。 但是,打印机签名中的指针*是什么意思? – Cyberflow

+0

添加一些关于此的信息。上下文可能是人们试图创建一个指向不完整类型的指针,有时称为_opaque指针_。这是一种在C中实现真正私有封装的方法。如果是这种情况,最好不要将它作为指针输入。最好做'typedef struct image image'并强制调用者使用指针语法。 – Lundin

回答

3

typedef,章§6.7.8,C11文档的语义,

在声明其存储类说明是typedef,每个声明符定义一个 标识符是表示typedef名使标识符指定类型[...]

因此,基本上,typedef用于创建一个别名对于给定类型。

此外,扩大对,

一个typedef声明不引入新的类型,只有 代名词所以指定的类型。即,在下面的声明:

typedef T type_ident;
type_ident D;

type_ident被定义为typedef名称与由该声明 说明符在T(称为T)中指定的类型,并且在D所述标识符具有“派生声明类型 - 列表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 -ing指针被认为是一个令人困惑的编码风格,这会降低可读性,恕我直言,避免typedef-ing指针。


关于部分

但到底是什么在typedef的签名指针*是什么意思?

这意味着,新的别名是指针类型。对于情况下,

typedef struct image * Image; 

两个

Image iPointer = NULL; 

struct image * againIPointer = NULL; 

相同。

+0

我会尝试应用您的解决方案;但是打印机签名中的指针*是什么意思? – Cyberflow

+0

@Cyber​​flow这意味着,别名是一个指针类型,让我解释我的答案有点覆盖。 –

+0

请参阅简短答案是否是'typedef'指针的好主意?](http://stackoverflow.com/questions/750178/is-it-a-good-idea-to-typedef-pointers) “不,除非它们是函数指针”。 –