首页
社区
课程
招聘
VC6的错误
发表于: 2005-6-13 12:32 7019

VC6的错误

2005-6-13 12:32
7019
len=sizeof(int)::GetCurrentProcessId();
上面的语句在VC6中编译通过,谁知道执行结果是什么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
len=4;
2005-6-13 13:29
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
经过调试发现,::后面的函数无论是什么VC都会被他忽略,不会编译到程序里去,所以::后的函数无论是什么,len都等于4(int的长度)。不过不明白是为什么会这样,期待下一楼解释。
2005-6-13 13:33
0
雪    币: 209
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
和操作系统相关
在32位机器上4,在64位机器上8。
2005-6-13 13:35
0
雪    币: 229
活跃值: (168)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
不明白的是为什么“::GetCurrentProcessId();”不被执行。这是不是VC的Bug呀!
2005-6-13 13:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
len=sizeof(int)::GetCurrentProcessId();
这是什么语法关系啊? 我第一次见到,为什么在
int后面跟::呢?
2005-6-13 14:47
0
雪    币: 229
活跃值: (168)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
最初由 huoshan 发布
len=sizeof(int)::GetCurrentProcessId();
这是什么语法关系啊? 我第一次见到,为什么在
int后面跟::呢?

把“::”去掉也是一样的!别让“::”影响了我们讨论的重点。
len=sizeof(int)GetCurrentProcessId();
2005-6-13 15:01
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
8
关注。。。
2005-6-13 17:56
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
9
写成这样都可以
len = sizeof(int)123;
len = sizeof(int)"adfetrgghf";
下面这个却不行:
#include <stdio.h>

void nop() {}

int main()
{
	int a = sizeof(int)nop();
	printf("%d\n",a);
	return 0;
}

改成这样就可以:
#include <stdio.h>

int nop() {return 0;}

int main()
{
	int a = sizeof(int)nop();
	printf("%d\n",a);
	return 0;
}

ft~~~可能是VC的BUG,编译器在解析sizeof运算符时出了问题..
2005-6-13 18:47
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
10
麻烦的是这样写也不出错:
int len;
len=sizeof(int)
GetCurrentProcessId();
但后面的GetCurrentProcessId();函数调用给忽略了。
2005-6-13 19:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
是不是有优先级问题?
2005-6-13 20:51
0
雪    币: 761
活跃值: (3652)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
这不是c的标准语法吧?
看编译器实现的问题,sizeof在编译阶段就展开为常量了.应该是vc的一个bug.不过vc本来对标准支持就查,我用intel CPP就编译不过
2005-6-13 21:33
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
13
可以试试用来做花指令,呵呵~  
2005-6-13 23:25
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
14
int a=sizeof 1;可以,因为运算符后可以直接跟表达式
GetCurrentProcessId强制转换成(int),然后取这个整数的长度,但是void不能强制,所以。。。。
sizeof是静态取值,函数没被调用
2005-6-14 00:07
0
雪    币: 207
活跃值: (41)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
这只能说是VC6太老了!
sizeof()以前是运算符,不是函数。以前是在编译期计算的。像int、char等这些类型的长度都是固定的,32位机器上直接用4替代sizeof(int);其它也是如此。复杂一些的比如结构,就是把各数据成员的长度加起来(最多就是考虑对齐)!编译器通过查找符号表,来确定某种类型的长度,然后返回该长度!C99标准sizeof()是运行期计算了,可以说是函数了!之所以C99的sizeof()是运行期运算,是因为C99支持了变长数组,所以想知道真正的长度就只能是在运行期才能知道了!
2005-6-19 10:53
0
游客
登录 | 注册 方可回帖
返回
//