社区
C语言
帖子详情
语法问题,可能有点难度,do_do帮我看看
GuanXP
2002-07-10 05:18:00
最近看到一段代码中有如下语句:
return (TF){a,get()};
在VC6下无法编译通过,g++可以。
这句话其实是强制转换数据列表为一个TF结构返回。
这种语法是C++的新标准还是g++的特别支持?
对含有vtable等复杂内存结构的类也有效吗?
...全文
45
13
打赏
收藏
语法问题,可能有点难度,do_do帮我看看
最近看到一段代码中有如下语句: return (TF){a,get()}; 在VC6下无法编译通过,g++可以。 这句话其实是强制转换数据列表为一个TF结构返回。 这种语法是C++的新标准还是g++的特别支持? 对含有vtable等复杂内存结构的类也有效吗?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 结构是不是自己写的?以前没见过啊?算我孤陋寡闻了.
学习
可否把完整代码贴出来,我编译一下试试
UE4 Slate 特殊
语法
UE Slate 特殊
语法
分析 简述 UE4 的Slate系统有很多奇怪的
语法
,创建新的SWidget对象时,
语法
中会包含SNew,.XXX() , +XXX 和 [XXX]类型的
语法
。 在自定义SWidget类的时候,会需要用到SLATE_BEGIN_ARGS , SLATE_END...
python装饰器详解之
语法
装饰器对于python初学者来说确实有些
难度
,博主一开始学的时候也有很多疑惑:一开始是觉的
语法
有些难懂,后来
语法
懂了,也不知到可以用到什么地方。本文将着重以简单的语言来讲述装饰器的
语法
,关于其应用将在另一篇...
python基础
语法
全解(两万字讲解,建议收藏)
python基础
语法
全解!
C#:基本
语法
看这一篇就够了
有关C/C++文档见以下链接: C/C++:基本
语法
看这一篇就够了_h,.n:)!i-CSDN博客 1. 基本
语法
结构 特性 C# C++ 程序入口点 static void Main(string[] args) int main() 语句结束 语句以分号 ; 结束 语句以分号 ; 结束...
python中text函数的
语法
_【01】Python基础
语法
好了,你现在心中是不是有个
问题
,要学好数据分析,一定要掌握 Python 吗?我的答案是,想学好数据分析,你最好掌握 Python 语言。为什么这么说呢?首先,在一份关于开发语言的调查中,使用过 Python 的开发者,80% ...
C语言
70,020
社区成员
243,264
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章