C标准中结构体成员的const限定疑问:GCC与IAR编译器对const结构体指针的指针成员类型解析分歧
C标准中结构体成员的const限定疑问:GCC与IAR编译器对const结构体指针的指针成员类型解析分歧
今天在工作里碰到个挺头疼的问题,是关于结构体里const限定符的传播逻辑的。我正在给一段老代码补全const正确性,结果发现GCC和IAR两个编译器对同一段代码的处理完全不一样,这可把我搞懵了。
核心争议其实很明确:当我们给一个结构体变量加上const限定后,它内部的指针成员到底会被解析成<type>* const(只有指针本身不可修改),还是const <type>* const(指针本身和指向的内容都不可修改)?
我写了个最小复现示例:
struct S { char* p; }; void f(const struct S* s) { char* non_const_char = s->p; *non_const_char = 'a'; // 修改的内容可以被认为是const结构体的一部分 }
这段代码在GCC下能正常编译通过,但到了IAR这里直接报错了,错误信息是:
value of type "char const *" cannot be assigned to an entity of type "char *"
我查了不少技术讨论,结论是GCC的行为才是符合C标准的——当const限定作用于结构体指针时,只会把结构体的成员本身变成const属性,对于指针成员来说,就是指针本身不可修改(相当于char* const),但指针指向的内容并不会被自动加上const限定。所以s->p的类型还是char*,而非const char*,自然可以赋值给char*类型的变量,也能修改指向的内容。
备注:内容来源于stack exchange,提问作者sljung
相关产品推荐
相关产品推荐

