没名的go struct 只有名字难道是多余的 吗

没名的 struct 难道是多余的 吗??????
关于网友提出的“没名的 struct 难道是多余的 吗??????”问题疑问,本网通过在网上对“没名的 struct 难道是多余的 吗??????”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题:没名的 struct 难道是多余的 吗??????
class&Test
struct&&//&class&&union&
&&&&&&&&int&&&&&&
void&main()
t.ref=10;&&//&为什么可以这样访问ref&&&难道有struct&{}&&是多余的?
}解决方案1:引用&15&楼&lann64&的回复:引用&13&楼&two_ears&的回复:
VC6编译可以通过,当然,这可能是不合标准的,&
不过我觉得只是编译器实现的问题吧,不理解这怎么能用命名空间解释,呵呵,概念扩大化了&
是编译器实现问题,但从逻辑上不符合。这样的无名struct,应该是无视之,但要是把它当成语句块处理,编译也可以实现。&
也就是说,编译器可以把struct连同花括号全无视处理,这虽然不是标准但是符合逻辑。当然也可以当成语句块,也就类似保留了花括号…
哦,对,要是编译器保留花括号,倒是解决了问题,
呵呵,个人感觉,这个写法还是没有必要
解决方案2:引用&9&楼&PRCLionel&的回复:引用楼主&mabo321&的帖子:
C/C++&code&
class&Test&
&&&&struct&&//&class&&union&
&&&&&&&&int&&&&&
&&&&&&&&int&&&&&
&&&&&&&&char&&&
void&main()&
&&&&Test&t;&
&&&&t.ref=10;&&//&为什么可以这样访问ref&&难道有struct&{}&&是多余的?&
对于anonymous&struct,是可以直接访问其成员的,其实编译器是会给这个结构体一个名字的,…
有了A勘定就没问题了,还是不懂,怎么能直接访问嵌套匿名结构体的成员,照理说根本没有实例化呀
如果想前面的说的是一个名字空间,那VC6这个错误也太大了
解决方案3:引用&7&楼&lann64&的回复:引用&5&楼&two_ears&的回复:
是有点怪,不知道标准上有没有,因为没见过这么写的&
C/C++&code&
&&&&struct&
&&&&&&&&int&n;&
&&&&struct&
&&&&&&&&int&n;&
&&&&A(){ZeroMemory(this,sizeof(A));}&
a.n=sizeof(A);&//&8&
int&*p=(int*)&a;&//&p[0]==8&&p[1]==0&
这是错误用法,无名结构是同一命名空间,不能有两个重名变量。&
VC6编译可以通过,当然,这可能是不合标准的,
不过我觉得只是编译器实现的问题吧,不理解这怎么能用命名空间解释,呵呵,概念扩大化了
解决方案4:
g++&-ansi&-Wall&-pedantic&TTest.cpp&-o&TTest.o
TTest.cpp:9:&warning:&ISO&C++&prohibits&anonymous&structs
果然不出所料!这个不是标准C++。应该是扩展吧!
ANSI&C++&anonymous&unions: YES
ANSI&C++&anonymous&structs: NO
ANSI&C&anonymous&structs: NO
ANSI&C&anonymous&unions: NO
ANSI&C&anonymous&unions: NO的证据:
http://www.cenapad.unicamp.br/parque/manuais/Ibmcxx/language/ref/rucldun.htm
Anonymous&unions&are&not&part&of&the&the&ANSI&C&language&standard,&and&are&supported&by&IBM&C&and&C++&Compilers&in&extended&&compiler&mode&only.
ANSI&C&anonymous&structs: NO的证据:
/en-us/library/z2cx9y4f.aspx这里有,但是
/en-us/library/34h23df8.aspx说明是VC的extension.解决方案5:引用楼主&mabo321&的帖子:C/C++&code
class&Test
&&&&struct&&//&class&&union&
&&&&&&&&int&&&&&&
&&&&&&&&int&&&&&&
&&&&&&&&char&&&&
void&main()
&&&&Test&t;
&&&&t.ref=10;&&//&为什么可以这样访问ref&&&难道有struct&{}&&是多余的?
对于anonymous&struct,是可以直接访问其成员的,其实编译器是会给这个结构体一个名字的,例如struct_xxxx之类的。
不能说anonymous&struct的struct是多余的,因为有一种情况关键字struct是不可以省略的。
上面这个结构体也是anonymous&struct,A是这个anonymous&struct定义的变量。
如果类的两个anonymous&struct在同一生存空间,并且有相同名称的变量,那么,一个良好的编译器是会给出编译错误的。
conflicts&with&previous&declaration&`int&A::&anonymous&struct&::n'&解决方案6:引用&18&楼&clover8&的回复:不懂,感觉上不是多余。。
有时候有点用,不过不喜欢。#include&&iostream&
using&namespace&
union&U&&//严重依赖机器实现,假设short是2&byte,char是1&byte
&&&&struct&{
&&&&&&&&short&i1;
&&&&&&&&short&i2;
&&&&struct&{
&&&&&&&&char&c1;
&&&&&&&&char&c2;
&&&&&&&&char&c3;
&&&&&&&&char&c4;
int&main()
&&&&u.i1=84;
&&&&u.i2=85;
&&&&cout&&u.c1&&"&"&&u.c3&&
&&&&return&0;
}解决方案7:引用&13&楼&two_ears&的回复:VC6编译可以通过,当然,这可能是不合标准的,&
不过我觉得只是编译器实现的问题吧,不理解这怎么能用命名空间解释,呵呵,概念扩大化了
是编译器实现问题,但从逻辑上不符合。这样的无名struct,应该是无视之,但要是把它当成语句块处理,编译也可以实现。
也就是说,编译器可以把struct连同花括号全无视处理,这虽然不是标准但是符合逻辑。当然也可以当成语句块,也就类似保留了花括号,
可这样后面的引用如何理解?两个同名变量又是引用的哪一个?显然存在二义,不合逻辑。
无视了花括号,无名结构就存在于它外部名字空间里,在这里也就是class&A,在这同一空间里,当然不能有同名变量了。
解决方案8:
匿名的结构体本身没有什么意义,但是可以创建匿名的结构体对象,可以达到某些特殊目的吧class&Test
&&&&struct&&//&class&&union&
&&&&&&&&int&&&&&&
&&&&&&&&int&&&&&&
&&&&&&&&char&&&&
int&_tmain(int&argc,&_TCHAR*&argv[])
a.A.ref&=&10;
}解决方案9:引用&5&楼&two_ears&的回复:是有点怪,不知道标准上有没有,因为没见过这么写的&
C/C++&code
&&&&struct
&&&&&&&&int&n;
&&&&struct
&&&&&&&&int&n;
&&&&A(){ZeroMemory(this,sizeof(A));}
a.n=sizeof(A);&//&8
int&*p=(int*)&a;&//&p[0]==8&&p[1]==0
这是错误用法,无名结构是同一命名空间,不能有两个重名变量。
struct是多余的?或许,不过存储空间分配上看或许就不是无影响的了。
上一篇: 下一篇:
联系邮箱:(#改为@)我的VC之路--struct多种声明定义写法的小结 - CSDN博客
我的VC之路--struct多种声明定义写法的小结
struct多种声明定义写法的小结
详细讲解struct这个容易混淆的写法的书是有的,《C专家编程》中就有详细的描述。可惜大家喜欢问问题有甚于喜欢看书,于是BBS上泛滥着前人早已经解决、说明清楚的问题。哎,中国勤学好问者的悲哀。这里简要说明一下struct,为大家省钱。
/* struct.c*& 本程序演示了struct的种种写法。注意,所有这些写法都能编译通过*& author: smileonce*& date& : */
// 这种写法是最要命的,但是它却可以通过, 最后面那个foo是结构体的实例struct foo{&&&}
// 有了typedef,意义明显与上面不同,注意的是struct后面那个标签可以不写,最后面那个bar是匿名结构体的别名typedef struct {&&&}
// 这种写法是需要值得关注的一次性筷子,我们都喜欢用它,struct1是一个匿名struct的实例,一个天然的SingleTonstruct {&&&} mystruct1;
//最常用的写法,清晰不言自明,my_struct_tag是结构体标签,my_struct_type是struct my_struct_tag的别名typedef struct my_struct_tag{&&&} my_struct_
// 下面两种定义的写法都可以,当然使用typedef定义的写法更简洁些my_struct_type mystruct2;&&&&&&&&&&&& //通过typedef定义的结构别名来定义变量struct my_struct_tag mystruct3;&&&&&& //通过结构标签定义变量
int main(int argc, char *argv[]){&return 0;}&
本文已收录于以下专栏:
相关文章推荐
struct多种声明定义写法的小结 详细讲解struct这个容易混淆的写法的书是有的,《C专家编程》中就有详细的描述。可惜大家喜欢问问题有甚于喜欢看书,于是BBS上泛滥着前人早已经解决、说明清楚的问题...
结构体与函数:
关于传参,首先:
void func(int);
func(a.b.c);
把结构体中的int成员变量当做和普通int变量一样的东西来使用,是不用脑子就想到的一种方法。
声明:我把class定义的类型称为类,struct定义的类型称为结构体。
C++中,如果要在一个类A的声明中用到另一个类B的指针或引用,需要包含类B的头文件,如果不想包含,可以使用向前声明。
Struct(结构体)的声明、定义及初始化
上一篇里我们讲了为什么我们要引入Struct这个数据类型,我们了解到Struct是一种聚合数据类型,是为了用户描述和解释一些事物的方便而...
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。结构体最最主要的意义就是封装,而封装的好处就是可以再次利用。掌握了结构体的定义和使用方法,对编程具有非常重要的意义...
一、typedef的用法
在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; ty...
半路出家, 我的iOS自学之路-4-Block的声明,定义,闭包性,强引用循环
我是一只绝望的菜鸟, 只学过Java, 半路出家, 自学iOS.
以下是我读完《Objective - C 编程》(第...
结构体(struct)是各种变量组合形成的新数据类型,struct有多种定义形式,总结下来可分四种,初学者容易混淆。下面一并整理区分,其中要特别留意区分三个元素:结构标签名,结构变量名,结构别名。
结构体定义 typedef struct 用法详解和用法小结
( 15:40:15)
typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。
具体区别在于:
若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)struct 动态数组 泛型 的合用
20AnGelCss]
编辑:www.fx114.net
本篇文章主要介绍了"struct 动态数组 泛型 的合用
20AnGelCss]",主要涉及到struct 动态数组 泛型 的合用
20AnGelCss]方面的内容,对于struct 动态数组 泛型 的合用
20AnGelCss]感兴趣的同学可以参考一下。
最近学STL的泛型,自己想做一个&struct&结构体的泛型.
template&&class&T&
struct&node
&T&//站点编号
&T&ad[4];//IP编号
&node(){po=0;&ad[0]=ad[1]=ad[2]=ad[3]=0;}
&node(T&p,T&a[4])&{
&&ad[0]&=&a[0];
&&ad[1]&=&a[1];
&&ad[2]&=&a[2];
&&ad[3]&=&a[3];
#define&node&struct&node
在申请&struct&node&动态数组的时候老是不对~~
我是这样写的:
node&int&&*no&=&(node&int&&*)malloc(sizeof(node&int&)*4);
node&int&&*no&=&new&node&int&()[3];
node&int&&*no&=&new&node&int&[3];
应该怎么写呢&node&&int&&*no&=&new&node&&int&[3];&
这样写不行吗?node&&int&&*no&=&new&node&&int&()[3];&这个不对。
但其它两个都是对的啊。
#define&node&struct&node&
——这句是多余的,C++中结构体名可以直接做类型用,不用加struct。你模板都用上了,肯定是C++了,还要这句干吗。这样居然可以:
template&&class&T&
struct&node
&T&//站点编号
&T&ad[4];//IP编号
&node(){po=0;&ad[0]=ad[1]=ad[2]=ad[3]=0;}
&node(T&p,T&a[4])&{
&&ad[0]&=&a[0];
&&ad[1]&=&a[1];
&&ad[2]&=&a[2];
&&ad[3]&=&a[3];
node&int&&*no&=&new&node&int&[3];
谁能解释一下?
还有&二楼法师的&typedef&要怎么用呢?
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 4917 人关注过本帖
标题:测试发现struct也可以有构造函数
等 级:侠之大者
帖 子:2168
专家分:425
结帖率:79.83%
&&问题点数:0&&回复次数:6&&&
测试发现struct也可以有构造函数
struct Msg_DisConnect
&&& TBYTE msg_type: 8;
&&& Msg_DisConnect()
&&&&&&&&msg_type = 0xE5;
&&&&&&&&if(ERROR_FLAG)
&&&&&&&&&&&&int n = GetTickCount()%101;
&&&&&&&&&&&&if(n&30)
&&&&&&&&&&&&&&& msg_type +=
上面的程序中使用的构造函数竟然可以!!难怪大家都说class和struct是一样的
搜索更多相关主题的帖子:
等 级:贵宾
威 望:27
帖 子:4422
专家分:4019
难怪大家都说class和struct是一样的
这句话是误导, 至少偶没这样说过
我就是真命天子,顺我者生,逆我者死!
等 级:职业侠客
帖 子:208
专家分:346
回复 楼主 vfdff
struct和class在c++中唯一的差别就是struct默认的访问权限是public而class是private。
但struct在c++中出现只是为了兼容c,除此之外没有别的用途。
身体是玩命的本钱
等 级:论坛游民
帖 子:25
专家分:23
以下是引用zhddragon在 21:24:29的发言:
struct和class在c++中唯一的差别就是struct默认的访问权限是public而class是private。
但struct在c++中出现只是为了兼容c,除此之外没有别的用途。写的对。。
等 级:侠之大者
帖 子:2168
专家分:425
恩 书上也读这么说的
~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
等 级:职业侠客
帖 子:208
专家分:346
回复 5楼 vfdff
如果需要把c项目转移到到c++上那么这句活的意思就很明显了。
在c++里引入class这个关键字后struct的作用就完全可以被class取代了(在这里你找不到struct能做到的而用class无法实现的,速度因素排除在外),单从c++考虑struct在这时候就显得多余了,完全可以去掉。但是c++要兼容c,要求已有的c项目可以很容易(最好不用修改)用c++编译通过,所以作为c关键字的struct被保留了下来,而struct在c++的默认访问权限是public也是因为c没有访问权限这一说(相当于全部都是public)。
身体是玩命的本钱
等 级:侠之大者
帖 子:2168
专家分:425
恩,看来最初设计不好,总是会留下病根的
~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
版权所有,并保留所有权利。
Powered by , Processed in 0.109273 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved

我要回帖

更多关于 c 取struct的变量名 的文章

 

随机推荐