语法问题,可能有点难度,do_do帮我看看

GuanXP 2002-07-10 05:18:00
最近看到一段代码中有如下语句:

return (TF){a,get()};

在VC6下无法编译通过,g++可以。
这句话其实是强制转换数据列表为一个TF结构返回。

这种语法是C++的新标准还是g++的特别支持?
对含有vtable等复杂内存结构的类也有效吗?
...全文
45 13 打赏 收藏 转发到动态 举报
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 结构是不是自己写的?以前没见过啊?算我孤陋寡闻了.

学习

可否把完整代码贴出来,我编译一下试试

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧