【发布时间】:2014-04-13 14:33:54
【问题描述】:
我有一个结构 type_s。然后我 typedef 一个指向结构 type_s 的指针作为类型。
如果我有一个const struct type_s*,那么编译器将正确地抱怨是否对结构成员进行了赋值,如函数 Test1() 所示。但是如果我创建一个 const 类型,它是同一个结构指针的 typedef,编译器不会抱怨和编译,函数 Test2()。
typedef struct type_s* type ;
struct type_s
{
int a ;
} ;
void Test1( const struct type_s* t )
{
t->a = 123 ; //complains, ok
}
void Test2( const type t )
{
t->a = 123 ; //doesn't, it should in my oppinion
}
对我来说,它们在逻辑上都是一样的。我错过了什么?
是为指向该结构的常量指针创建另一个 typedef 的唯一解决方案,如下所示:
typedef const struct type_s* ctype ;
这将像在 Test1() 中一样正常工作。
【问题讨论】:
-
如果你有
const T t,这意味着t是常量。typedefs 与#defines 不同。 -
一旦定义了类型(使用
typedef),您就不能再更改该类型了。任何明显适用于类型的限定符,都适用于对象。有问题的const不会被忽略;它应用于对象t。在函数内部你不能做t = NULL; -
const type t表示struct s_type * const t。不使用指针类型定义的另一个原因。 -
那里有很多糟糕的代码