简写typedef指向常量结构的指针

时间:2011-07-07 10:49:44

标签: c coding-style standards

使用typedef

声明结构
typedef struct some_struct {
int someValue;
} *pSomeStruct;

然后将它作为参数传递给带有const声明的某个函数,暗示'const some_struct * var'

void someFunction1( const pSomeStruct var )

结果变成

some_struct * const var

ISO C标准的第6.7.5.1节也说明了这一点,它表明在这种情况下'const'适用于指针而不适用于它所指向的数据。

所以问题是 - 有没有办法用typedef用shortended表示法声明一个const结构的指针,或者必须总是有一个特殊的单独声明:

typedef const struct some_struct *pcSomeStruct;
void someFunction2( pcSomeStruct var )

3 个答案:

答案 0 :(得分:8)

基本上,不要输入dede指针:)

typedef struct some_struct {} some_struct;

void some_function1(some_struct *var);
void some_function2(const some_struct *var);
void some_function3(some_struct *const var);
void some_function4(const some_struct *const var);

或者,根本不要输入def:D

struct some_struct {};

void some_function1(struct some_struct *var);
void some_function2(const struct some_struct *var);
void some_function3(struct some_struct *const var);
void some_function4(const struct some_struct *const var);

答案 1 :(得分:1)

这些也是有效的:

typedef struct some_struct {
    int someValue;
} const * pSomeStruct;

typedef struct some_struct {
    int someValue;
} const * const pSomeStruct;

但是这种风格在C ++中并没有被广泛使用。更确切地说:

struct some_struct {
    int someValue;
};

struct some_struct {
    int someValue;
};

然后分开typedef。但是,那也没有被广泛使用。许多其他C ++程序员和我宁愿声明你的函数,如void foo (some_struct const * const)或类似的,除了反对指针的通常原因。

答案 2 :(得分:0)

就我对C型系统的理解而言,你不应该这样做。第一个typedef声明类型为“指向结构的指针”。将const应用于逻辑上会创建“指向struct的const指针”。向结构本身注入const'ness将需要改变类型本身,因此,重新定义。 AFAIK,C中的类型组合是增量式的,您只能通过将修改器应用于现有类型而不是注入来创建新类型。

无论如何,指针的Typedef都不是一个好的样式。