C 常量限定符被忽略

C 常量限定符被忽略,c,constants,typedef,c99,C,Constants,Typedef,C99,我有一个结构类型。然后我键入一个指向结构类型的指针作为类型 如果我有一个const struct type_s*,那么编译器将正确地抱怨是否对结构成员进行了赋值,如函数Test1()中所示。但是如果我创建一个const type,它是同一个结构指针的typedef,编译器将不会抱怨并编译函数Test2() 对我来说,它们在逻辑上都是一回事。我错过了什么 是为指向该结构的常量指针创建另一个typedef的唯一解决方案,如下所示: typedef const struct type_s*ctype

我有一个结构类型。然后我键入一个指向结构类型的指针作为类型

如果我有一个
const struct type_s*
,那么编译器将正确地抱怨是否对结构成员进行了赋值,如函数Test1()中所示。但是如果我创建一个const type,它是同一个结构指针的typedef,编译器将不会抱怨并编译函数Test2()

对我来说,它们在逻辑上都是一回事。我错过了什么

是为指向该结构的常量指针创建另一个typedef的唯一解决方案,如下所示:

typedef const struct type_s*ctype


它将像Test1()一样正常工作。

您缺少的是常量指针与指向常量对象的指针不同。每个都有一个。常量指针是其存储地址不可修改的指针;指向常量的指针不能用于修改其引用对象。

它们不是一回事<当应用于指针变量和非指针变量的定义或声明时,code>const
具有不同的语义

const struct type_s *t 
上面的语句将
t
定义为指向
const struct type_s
类型的对象的指针。这里,
const
限定对象
t
指向的类型
struct type
,而不是指针
t

typedef struct type_s *type ;
上面的语句为类型
结构类型*
定义了一个名为
type
的别名

const type t;
// equivalent to
type const t;
// equivalent to
struct type_s *const t;

上述语句将
t
定义为
type
类型的常量对象。此处
const
限定对象。不能将
typedef
替换为其原始类型,并将其作为宏重新解释。指针信息嵌入在
typedef
中,它将被视为非指针类型。

如果您有
const T
,这意味着
T
是常量
typedef
s与
#define
s不同。一旦定义了类型(使用
typedef
),就不能再更改该类型。任何明显应用于类型的限定符,都将改为应用于对象。有问题的
常量
不被忽略;它应用于对象
t
。函数内部不能执行
t=NULL
const type t
表示
struct s_type*const t
。还有一个不使用指针类型定义的原因。那里有很多不好的代码。我在哪里有一个常量指针?
const-type
相当于
type-const
,在你的例子中,它为你提供了
struct-type\u-s*const
,而你认为你得到的是
const-struct-type.
。另一种看待它的方式是,您想要
(const-struct-type\u-s)*
,但是您得到了
const(struct-type\u-s*)
const type t;
// equivalent to
type const t;
// equivalent to
struct type_s *const t;