关于C++标准的问题.

双杯献酒 2004-09-22 09:12:48
下面的程序为什么无法通过编译,
(1)C++标准就这样规定的吗?
(2)C++标准要求,但DevC++未实现吗?
(3)C++未对此做规定吗?
(4)其他...

欢迎大家踊跃发言.

// DevC++ Ver4.9.8.0
#include <iostream>
#include <stdlib.h>
using namespace std;

class X
{
public:
int data;
};

int main(int argc, char *argv[])
{
cout << "X::data size = "
<< sizeof(X::data) // 这里无法通过编译!
<< endl;
system("PAUSE");
return 0;
}
...全文
967 100 打赏 收藏 转发到动态 举报
写回复
用AI写文章
100 条回复
切换为时间正序
请发表友善的回复…
发表回复
RealMDK 2004-09-24
  • 打赏
  • 举报
回复
无法通过编译是肯定的。原因是X::data在这里还没有定义啊(尽管它被生命为public)。
你要使用对象X::data作为 sizeof 的操作数,而X::data在此还为定义,既它还没有被实体化。
RealMDK 2004-09-24
  • 打赏
  • 举报
回复
如果我们这样写:
int d;
sizeof (d);
没有错!因为int型对象d是可见的。

但是像老兄这样:
int main(int argc, char *argv[])
{
cout << "X::data size = "
<< sizeof(X::data) // 这里无法通过编译!
<< endl;
system("PAUSE");
return 0;
}
无法通过编译是肯定的。原因是X::data在这里还没有定义啊(尽管它被生命为public)。
gdc123 2004-09-23
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3398/3398192.xml?temp=.6654779
rujor 2004-09-23
  • 打赏
  • 举报
回复
mark
BluntBlade 2004-09-23
  • 打赏
  • 举报
回复
编译器在推断X::data的时候犯迷糊啦。
nevercoming 2004-09-23
  • 打赏
  • 举报
回复
这是一个愚蠢的问题哦!
Jet法拉利 2004-09-23
  • 打赏
  • 举报
回复
就是静态成员的问题
我觉得这些各方面没有必要太在意阿
双杯献酒 2004-09-23
  • 打赏
  • 举报
回复
“X::data”不是一个合法的表达式,所以没有类型
觉得 plainsong(短歌) 说的有道理,
虽然X::data的类型是确定的,sizeof(X::data)也是确定的,
但由于X::data不是合法的表达式,
从而sizeof(X::data)无法通过编译。

我个人认为这是C++的一个缺陷。
不过可以用一种曲折的方法来完成工作,
sizeof(((X*)0)->data)
短歌如风 2004-09-23
  • 打赏
  • 举报
回复
class X
{
public:
int data;
};
X x;

“X::data”不是一个合法的表达式,所以没有类型,sizeof(X::data)无法计算。
“x.data”是一个合法的表达式,它的类型是int。sizeof(x.data)相当于sizeof(int)。
“&X::data”是一个合法的表达式,它的类型是“int X::*”。sizeof(&X::data)相当于sizeof(int X::*);

此外有的编译器可以在“成员指针表达式”中省略“&”,尤其是当成员是函数时,也就是说,在某些编译器中会把X::data当成是&X::data,这时sizeof(X::data)可能会被当作sizeof(&X::data)编译通过。
双杯献酒 2004-09-23
  • 打赏
  • 举报
回复
“除非是类属性才可以直接对它进行存取”
自然没有错。
不过,我认为
sizeof(X::data)
并没有对X::data进行“存取”,
只是对“X::data的类型”进行操作。
nirvana_li 2004-09-23
  • 打赏
  • 举报
回复
对,楼上的说的很对,必须要对类进行实例化为对象了才能够访问它的public成员,dev_c++编译器给出的提示很正确“除非是类属性才可以直接对它进行存取”,在C++中类属性的表示可以用static修饰。
zoohoo 2004-09-23
  • 打赏
  • 举报
回复
必需要用实例才能访问public成员啊,除非你的成员是static的
COpyFRee 2004-09-23
  • 打赏
  • 举报
回复
精彩!
riding 2004-09-23
  • 打赏
  • 举报
回复
和stotty的观点一样,sizeof 是C语言的兼容语句,在编译器编译的时候就已经计算成数值,需要参数要么是类型,或者是实际的变量。
carambo 2004-09-22
  • 打赏
  • 举报
回复
同意 freefalcon(心宇—小小菜鸟想高飞) 大家在编译程序出错时候一定要自己仔细分析出错信息。
要是在vc下最好查看msdn!!
ccj200308053 2004-09-22
  • 打赏
  • 举报
回复
up
sharkhuang 2004-09-22
  • 打赏
  • 举报
回复
提示还很准确的。
zhangfjj 2004-09-22
  • 打赏
  • 举报
回复
mark一下,吃饭先
cpunion 2004-09-22
  • 打赏
  • 举报
回复
刚刚对VC和GCC这2种编译器做了测试,int X::get100 (int a, int b)这个nonstatic 成员函数,在GCC中被编译为:
int (*_X_get100)(X* _this, int, int);
在VC中被编译为:
int (*_X_get100)(int, int, X* _this);

以此说明nonstatic function member也被编译为全局函数,以及能通过类名访问的原因
yjh1982 2004-09-22
  • 打赏
  • 举报
回复
楼主的写法不标准.
加载更多回复(80)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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