【问题标题】:Const qualifier ignored [duplicate]常量限定符被忽略[重复]
【发布时间】: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。不使用指针类型定义的另一个原因。
  • 那里有很多糟糕的代码

标签: c constants typedef c99


【解决方案1】:

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

【讨论】:

  • 我在哪里有一个 const 指针
  • const type 等价于 type const 在你的情况下给你struct type_s* const 而你认为你得到const struct type_s*。另一种看待它的方式是你想要(const struct type_s)*,但你得到了const (struct type_s*)
【解决方案2】:

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

const struct type_s *t 

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

typedef struct type_s *type ;

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

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

上面的语句将t定义为type类型的常量对象。这里const 限定了对象。您不能将typedef 替换为其原始类型并重新解释它,就好像它是一个宏一样。指针信息嵌入在typedef中,将被视为非指针类型。

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2014-10-16
    相关资源
    最近更新 更多