社区
C语言
帖子详情
语法问题,可能有点难度,do_do帮我看看
GuanXP
2002-07-10 05:18:00
最近看到一段代码中有如下语句:
return (TF){a,get()};
在VC6下无法编译通过,g++可以。
这句话其实是强制转换数据列表为一个TF结构返回。
这种语法是C++的新标准还是g++的特别支持?
对含有vtable等复杂内存结构的类也有效吗?
...全文
99
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 结构是不是自己写的?以前没见过啊?算我孤陋寡闻了.
学习
可否把完整代码贴出来,我编译一下试试
Android学习笔记(21)————利用JDBC连接服务器数据库
/******************************************************************************************** * author:conowen@大钟
javaadt连接mysql,Android学习笔记(21)————利用JDBC连接服务器数据库
jdbcandroid服务器microsoftsqlserverpostgresql1、Android平台下与服务器数据库通信的方法在Android平台下,连接电脑服务器的MySQL、PostgreSQL、Oracle、Sybase、MicrosoftSQLServer等数据库管理系统DBMS(database management system),主要有以下两种方法:方法1、直接连接在Andro...
Android Studio连接云服务器数据库
Android Studio连接云服务器数据库写在开始1.Navicat连接云服务器数据库2.MyEclipse开发服务端servlet的相关步骤Android Studio端代码编写 写在开始 这篇教程用于记录一下我的一次Android Studio连接数据库的过程。在网上找别人的教程的时候看到了一篇很详细的教程,链接附在下方了,这里想针对在按照这篇链接制作的时候的一些
问题
做一些解释。 按步骤一...
小白亲自实践 Android Studio 连接MySQL数据库,并实现表查询。
最近做毕设——基于Android开发,同时也在学《第一行代码》。为了方便让自己的 App 能连上MySQL,并实现数据增删改查,查了很多JDBC编程的资料,下面谈谈我怎么实现的。 1.首先要确保自己的电脑上装了MySQL并启动了MySQL服务,可以通过cmd命令行和服务查看。 ...
Android使用JDBC连接mysql数据库
移动设备中常用的数据库时sqlite数据库,Android设备中也不例外,但是今天我们就来讨论一下如何使用Android连接mysql数据库在实际的项目中貌似很少使用android连接mysql数据库,通常是在Android客户端通过Http请求将数据传送到服务端,然后再服务端连接mysql数据库。在学习android连接Mysql 数据库前,我们先来复习一下java如何通过jdbc连接Mysql
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章