社区
C语言
帖子详情
语法问题,可能有点难度,do_do帮我看看
GuanXP
2002-07-10 05:18:00
最近看到一段代码中有如下语句:
return (TF){a,get()};
在VC6下无法编译通过,g++可以。
这句话其实是强制转换数据列表为一个TF结构返回。
这种语法是C++的新标准还是g++的特别支持?
对含有vtable等复杂内存结构的类也有效吗?
...全文
88
13
打赏
收藏
语法问题,可能有点难度,do_do帮我看看
最近看到一段代码中有如下语句: return (TF){a,get()}; 在VC6下无法编译通过,g++可以。 这句话其实是强制转换数据列表为一个TF结构返回。 这种语法是C++的新标准还是g++的特别支持? 对含有vtable等复杂内存结构的类也有效吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
GuanXP
2002-07-12
打赏
举报
回复
呵呵,alula(alula)C++水平挺高的呀,交个朋友吧,
我的Email:Guanxp@163.net
这样一说,我似乎有点明白了,因为C++标准支持
TF tf={1,1.11};//这种形式也不适合于带vtalbe的类
而这和
TF tf = TF{1, 1.1};
从语义上来说几乎是等价的(多了一次拷贝构造而已),
所以VC不支持应该是VC的漏洞。
alula
2002-07-11
打赏
举报
回复
我想...
1. 正是强制类型转换。
2. 当struct带有vtable的时候,编译器就不把struct当作一般的复合类型看待了,而与class一致。vc, g++都强制你通过constructor初始化和构建对象。
另外,简单这么说咯,g++支持形式如
TF tf = TF{1, 1.1};
这样把一块stack内存强制转换为某类型的形式,而VC不支持。
这种形式的类型转换是不是标准C++支持的就不知道了。
纯属个人想法。
GuanXP
2002-07-11
打赏
举报
回复
我丝毫不怀疑对vptr的位置不同的编译器有不同的处理策略,
相反我是意识到vptr的存在同给这种语法之间的矛盾才问这
个问题的。事实上,vptr放在哪里都会有问题,如果该语法仅
仅是我所理解的强制类型转换的话。
如果该语法如此脆弱,g++又为何支持?做g++编译器的人可不
只是一些玩家,他们自然有他们的道理。
所以,我的问题是
1。这种语法的意义是否就是我所理解的强制类型转换
2。如果是,那麽它如何处理带vptr的结构?
alula
2002-07-11
打赏
举报
回复
#include <iostream>
using namespace std;
struct TF
{
int n;
double f;
virtual void vprint() {
cout << "&this=" << &*this << endl;
cout << "&n=" << &n << endl;
cout << "&f=" << &f << endl;
};
};
int main() {
TF tf;
tf.vprint();
}
g++ 输出:
&this=0x22ff60
&n=0x22ff60
&f=0x22ff68
cl 输出:
&this=0012FF68
&n=0012FF70
&f=0012FF78
可见vptr放置的位置。
GuanXP
2002-07-11
打赏
举报
回复
anthonychow(Tony Chow) 将问题看错了。如果是圆括号,这样的语法大家都明白。
alula
2002-07-11
打赏
举报
回复
<C++ inside object modle>在讲对象模型时候,有略带过关于放置vptr的不同实现。
anthonychow
2002-07-11
打赏
举报
回复
struct TF
{
int n;
double f;
TF(int N,double F):n(N),f(F){}
TF(){}
};
...
return TF(a,get());
alula
2002-07-11
打赏
举报
回复
我觉得在含有vtable的时候,即使是g++这种做法也不行。因为{int, float}
的内存块大小和含有 vptr的class/struct就不一致了。
vc编译器把 vptr 放置在 class or struct 区域的前面,似乎是在速度上的考虑。
而 gnu的编译器出于更好兼容以前的struct 的考虑,把vptr放在后面。
好像是这样。也好像是这样,vc编译器就禁止对struct进行这样类型转换了。
anthonychow
2002-07-11
打赏
举报
回复
struct TF
{
int n;
double f;
TF(int N,double F):n(N),f(F){}
TF(){}
};
...
return TF(a,get());
anthonychow
2002-07-11
打赏
举报
回复
struct TF
{
int n;
double f;
TF(int N,double F):n(N),f(F){}
TF(){}
};
...
return TF(a,get());
如果是C++,机构体也可以当作类来用,只是缺省访问属性为public。
ttzzgg_80713
2002-07-11
打赏
举报
回复
struct
GuanXP
2002-07-11
打赏
举报
回复
Yes,TF is a struct.
Sample code:
//----------------------------
//Sample begin
//----------------------------
struct TF
{
int n;
double f;
};
double get()
{
return 1.23;
}
TF Func()
{
int a;
return (TF){a,get()};
}
//----------------------------
// Sample end
//----------------------------
Kuye2002yx
2002-07-11
打赏
举报
回复
TF 结构是不是自己写的?以前没见过啊?算我孤陋寡闻了.
学习
可否把完整代码贴出来,我编译一下试试
SQL语言的
语法
糖
本文深入探讨了SQL语言中的
语法
糖,包括子查询与JOIN、COALESCE函数、CASE表达式和CTEs等示例。分析了
语法
糖在提高代码可读性、降低错误概率和加快开发速度方面的优点,同时也指出了其
可能
带来的性能
问题
和维护
难度
。最后,提出了在实际应用中合理使用
语法
糖的策略。
Python与PHP:
难度
之辩
本文对比分析了Python和PHP这两种编程语言的入门及进阶
难度
。从
语法
结构、特性、应用领域等多个维度出发,深入探讨了两者之间的差异,并对各自的优缺点进行了详细阐述。
牛客基础
语法
题(中等
难度
与部分简单
难度
)(上)每道题后面全有题目链接
本文分享牛客网在线编程基础
语法
的多道中等
难度
题解题思路。涉及多个if与else if区别、浮点数强制类型转换、坐标关系判断、二维数组打印规律等,还补充了回文数知识,给出各题对应牛客网链接。
C语言的
语法
糖
本文深入探讨C语言中的
语法
糖,介绍了
语法
糖概念,列举条件、自增自减等运算符及结构体、枚举类型等
语法
糖示例。分析了
语法
糖利弊,如简化代码但
可能
影响可读性、带来性能损耗和增加调试
难度
。还给出使用技巧,合理选择、注重规范和加强注释可提高开发效率。
Python 为什么不设计 do-while 循环结构?
Python不支持do-while循环,主要是因为Python的设计哲学、简洁性以及已有
语法
能实现类似功能。do-while在其他语言中的作用,如确保至少执行一次循环体、在宏定义和跳转控制中的应用,在Python中可以通过其他方式实现。Python之父Guido van Rossum也反对引入新的循环结构,认为这会增加学习和理解
难度
。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章