在GNU C中能否用.替代->作为结构体成员限定符?
在GNU C中关于结构体成员访问符
.和->的疑问解答 嘿,这两个问题其实都和GNU C对标准C的扩展特性有关,我来给你逐一拆解清楚:
1. 在GNU C的结构体中能否使用.作为成员限定符?
当然可以——而且不止是对结构体实例(非指针类型)使用,GNU C还扩展支持对结构体指针使用.运算符来访问成员。
在标准C的规则里,.只能用于直接访问结构体/联合体的左值(比如MyStruct s; s.num这种直接的实例),而指针必须用->(或者先解引用再用.,比如(*p).num)。但GNU C加了个便利扩展:当你对结构体指针使用.时,编译器会自动帮你完成隐式解引用,把p.member转换成(*p).member,效果和p->member完全一样。
2. 在GNU C中用.替代->作为结构体成员限定符是否可行?
在GNU C的编译环境下(默认开启扩展的话),是完全可行的——这也是你为什么没看到编译器报错的原因。
举个实际代码例子你就明白了:
#include <stdio.h> typedef struct { int value; } DemoStruct; int main() { DemoStruct obj = {100}; DemoStruct *ptr = &obj; // 标准C写法 printf("标准写法:obj.value = %d, ptr->value = %d\n", obj.value, ptr->value); // GNU C扩展写法:用.替代->访问指针成员 printf("GNU扩展写法:ptr.value = %d\n", ptr.value); // 等价于(*ptr).value return 0; }
编译运行这段代码(用gcc默认参数),完全可以正常输出结果,不会有任何报错。
不过要特别注意一个兼容性问题:这种写法是GNU特有的扩展,不属于标准C。如果你的代码需要移植到其他遵循标准C的编译器(比如clang关闭GNU扩展、或者其他严格的C编译器),这种写法就会触发编译错误。所以如果要保证代码的可移植性,还是建议遵循标准C的规范:用.访问结构体实例,用->访问结构体指针。
内容的提问来源于stack exchange,提问作者TonyP
相关产品推荐
相关产品推荐

