Chinaunix

标题: 请教:哪一个版本的VC比较好的支持标准c++?? [打印本页]

作者: jiekoo    时间: 2006-07-11 18:40
标题: 请教:哪一个版本的VC比较好的支持标准c++??
小弟 在做一个项目从vxworks转到wince,但由于这个项目大多是标准c++来写的,用vc6来编译 有很多问题。vc++对标准c++的支持很差。
请c++高人指点,vc8会不会好一点?
作者: converse    时间: 2006-07-11 18:42
VC6之后的版本都比VC6好的多,我现在用的7.1
作者: liubinbj    时间: 2006-07-11 19:20
vc6应该也支持c++的,不知道楼主说差是指哪方面?
作者: crashsky    时间: 2006-07-11 20:25
VC 8 . net 2005
作者: iwinux    时间: 2006-07-11 20:52
VC.NET 2003以后的版本对C++的标准化支持好了很多
作者: isnowran    时间: 2006-07-12 15:25
我觉得直到2005vc都不是标准的,可以通过简单的测试验证一下:

  1. int i = 0;
  2. for( int i = 0; i < 1; i++ )
  3. {}
复制代码

非标准的vc认为for循环的 int i 并非是局部变量
作者: apollolegend    时间: 2006-07-12 16:03
原帖由 isnowran 于 2006-7-12 15:25 发表
我觉得直到2005vc都不是标准的,可以通过简单的测试验证一下:

  1. int i = 0;
  2. for( int i = 0; i < 1; i++ )
  3. {}
复制代码

非标准的vc认为for循环的 int i 并非是局部变量

for循环中定义的变量的作用域在编译选项里是可以设置的,虽然微软独断专行,但对ANSI C++新标准的支持应该是没有问题的。如果你需要最新的C++标准我可以发给你一份,不过是E文的,而且有700多页!
作者: isnowran    时间: 2006-07-12 16:24
原帖由 apollolegend 于 2006-7-12 16:03 发表

for循环中定义的变量的作用域在编译选项里是可以设置的,虽然微软独断专行,但对ANSI C++新标准的支持应该是没有问题的。如果你需要最新的C++标准我可以发给你一份,不过是E文的,而且有700多页!

哦?我又土了,让我试试看
作者: lenovo    时间: 2006-07-12 17:51
原帖由 apollolegend 于 2006-7-12 16:03 发表

for循环中定义的变量的作用域在编译选项里是可以设置的,虽然微软独断专行,但对ANSI C++新标准的支持应该是没有问题的。如果你需要最新的C++标准我可以发给你一份,不过是E文的,而且有700多页!

>>for循环中定义的变量的作用域在编译选项里是可以设置的
标准里是这样说的吗?
作者: converse    时间: 2006-07-12 18:09
原帖由 isnowran 于 2006-7-12 15:25 发表
我觉得直到2005vc都不是标准的,可以通过简单的测试验证一下:

  1. int i = 0;
  2. for( int i = 0; i < 1; i++ )
  3. {}
复制代码

非标准的vc认为for循环的 int i 并非是局部变量


怎么我的7.1测试你的这个代码是对的呢?
作者: apollolegend    时间: 2006-07-12 19:43
原帖由 lenovo 于 2006-7-12 17:51 发表

>>for循环中定义的变量的作用域在编译选项里是可以设置的
标准里是这样说的吗?

举个最简单的例子:
你买了一台电脑,它只能在220V的电压下工作
而我也买了一台电脑,只不过他即可以在220v电压下工作也可以在110V(某些国家的市电电压)的电压下工作,
而这种转化只是经过一个小小的开关就可完成,且开关的初始位置放在220V上(标准的呀)。
你说我的计算机的电源是不是标准的呢?

在微软的c++编译器里就有这样一个开关 /ZC:forloop:
Visual C++ Compiler Options  
/Zc:forScope (Force Conformance in for Loop Scope)  
Used to implement standard C++ behavior for The for Statement loops with Microsoft extensions .
/Zc:forScope is on by default.

你可以看看msdn那里面还有例子!

[ 本帖最后由 apollolegend 于 2006-7-12 19:52 编辑 ]
作者: assiss    时间: 2006-07-12 19:46
不太同意楼上的例子。
标准还是遵守的好,如果标准有两个,设置开关无可厚非;如果只有一个,为什么还要节外生枝呢
作者: apollolegend    时间: 2006-07-12 19:56
人家只不过是在遵守标准的同时,有些自己的扩展而已。标准只在一定的范围之内有效,不然就不会有什么欧洲标准,美洲标准,国家标准等等,人人都遵守标准,世界就不会有进步。我不是说标准不该遵守,我是说标准是可以扩充的。
欢迎大家批评指正
作者: converse    时间: 2006-07-12 19:58
同意assiss的观点,标准既然已经白纸黑字了,那么应该是默认支持的
作者: apollolegend    时间: 2006-07-12 20:09
我觉得大家不能斥责那些遵守标准并且有些扩充的编译器(厂商),反而应该斥责那些根本就不遵守标准的编译器(厂商)。如果大家都乖乖的遵守标准,C++就不会是一个从90年的第一个C++标准到03年IOS/IEC14882的不断完善和完美的一个语言。

这是我的观点,希望板主们批评!
作者: assiss    时间: 2006-07-12 20:20
原帖由 apollolegend 于 2006-7-12 20:09 发表
我觉得大家不能斥责那些遵守标准并且有些扩充的编译器(厂商),反而应该斥责那些根本就不遵守标准的编译器(厂商)。如果大家都乖乖的遵守标准,C++就不会是一个从90年的第一个C++标准到03年IOS/IEC14882的不断 ...

其实扩展本没什么,GCC同样也有很多扩展。
但VC默认的编译竟然不支持标准,这有点过分了。非要去改选项才能支持,让人觉得它是在劫持标准。
作者: converse    时间: 2006-07-12 20:21
其他的我不知道,以前VC6的时候写下下面的代码会出现重复定义的:

void f()
{
   for (int i; ...)
       ...
   for (int i; ...)
       ...   
}

而只能这么写
void f()
{
  int i;
   for (i; ...)
       ...
   for (i; ...)
       ...   
}

就是说如果一个域的for循环声明里面有同样的变量名称,那么得提取出来一起定义.
别的不说,支持在for中重复定义同样名称的变量这个很好解决吧?
作者: converse    时间: 2006-07-12 20:22
原帖由 assiss 于 2006-7-12 20:20 发表

其实扩展本没什么,GCC同样也有很多扩展。
但VC默认的编译竟然不支持标准,这有点过分了。非要去改选项才能支持,让人觉得它是在劫持标准。


嗯,"劫持"两个字用的好
作者: lenovo    时间: 2006-07-12 23:20
原帖由 apollolegend 于 2006-7-12 19:43 发表

举个最简单的例子:
你买了一台电脑,它只能在220V的电压下工作
而我也买了一台电脑,只不过他即可以在220v电压下工作也可以在110V(某些国家的市电电压)的电压下工作,
而这种转化只是经过一个小小的开关就可 ...

你那句话会让别人以为,
不支持for循环内声明变量也是标准的一部分。

而事实上标准只有一个。另一个只是扩展。

而且默认不支持标准,而是支持它的扩展,
这个有点过分吧。呵呵,劫持。
作者: mik    时间: 2006-07-12 23:40
毫无意义的讨论
作者: lenovo    时间: 2006-07-12 23:49
原帖由 mik 于 2006-7-12 23:40 发表
毫无意义的讨论

哪里没有意义了,
请指出来。
作者: mik    时间: 2006-07-12 23:53
VC 对 C++ 标准支持不好是公认的

我们也管不着人家微软,你如果win平台工作,使用c++的话,似乎只有接受了

无谓再做什么讨论
作者: lenovo    时间: 2006-07-13 00:08
原帖由 mik 于 2006-7-12 23:53 发表
VC 对 C++ 标准支持不好是公认的

我们也管不着人家微软,你如果win平台工作,使用c++的话,似乎只有接受了

无谓再做什么讨论

〉〉VC 对 C++ 标准支持不好是公认的
可是有很多人并不知道这一点。
初学者学到这种问题首先会想到是不是自己错了。
会很困惑。

〉〉我们也管不着人家微软,你如果win平台工作,使用c++的话,似乎只有接受了
明白各个编译器之间的差异和对标准的支持程度还是很重要的。
作者: gouchishi    时间: 2006-07-13 00:16
vc8 已经是正确的
作者: suckstar    时间: 2006-07-13 08:00
VC都不好,用GNU之GCC吧!
作者: caibird3rd    时间: 2006-07-13 08:53
rubbish
关键是自己要养成好的编程习惯
作者: ttttstttt    时间: 2006-07-13 10:11
果然是无意义的讨论。

首先,标准和标准的实现不是一回事。所以上面有人说,“for循环中定义的变量的作用域在编译选项里是可以设置的,标准里是这样说的吗?”没意义。没有哪个标准会规定这种不属于标准范畴的标准的实现。
vc之所以有那个选项,只是为了和以前的版本兼容。VC现在是支持C++98标准最好的编译器之一。大家可以到Bjarne Stroustrup的主页去看看。

其次,每个具体的实现都会对标准做或多或少的扩充,这个是很平常的。就像C++98标准中规定template嵌套层次必须达到128层,而大多数编译器都远远超出这个要求了。标准不完美,C++还在发展中,还有N个open discuss还在进行中。

给大家两个网址
http://www.research.att.com/~bs/homepage.html
http://www.open-std.org/jtc1/sc22/wg21/

作为技术人员,就要be professional!
作者: lenovo    时间: 2006-07-13 13:00
原帖由 ttttstttt 于 2006-7-13 10:11 发表
果然是无意义的讨论。

首先,标准和标准的实现不是一回事。所以上面有人说,“for循环中定义的变量的作用域在编译选项里是可以设置的,标准里是这样说的吗?”没意义。没有哪个标准会规定这种不属于标准范畴的 ...

>>没有哪个标准会规定这种不属于标准范畴的标准的实现。
这句话是什么意思?
作者: apollolegend    时间: 2006-07-13 13:19
(C)ISO/IEC ISO/IEC 14882:2003(E)
6 Statements  6.5.3 The for statement
[stmt.for] 6.5.3 Theforstatement
1 Theforstatement
for ( for-init-statement condition ; expression ) statement
is equivalent to
{
for-init-statement
while ( condition ) {
statement
expression ;
}
}
except that names declared in the for-init-statement are in the same declarative-region as those declared in
the condition, and except that a continue in statement (not enclosed in another iteration statement) will
execute expression before re-evaluating condition. [Note: Thus the first statement specifies initialization
for the loop; the condition (6.4) specifies a test, made before each iteration, such that the loop is exited
when the condition becomes false; the expression often specifies incrementing that is done after each
iteration. ]

这是03版标准的for循环,在标准的99页,原文是pdf,本想截个图,感觉贴图又麻烦,大家凑乎着看吧
我想说的就是在windows下我用微软的编译器,在posix平台上我用cc或gcc.
ttttstttt兄弟说的不错,我们都应该是不断前进的!
作者: isnowran    时间: 2006-07-13 13:22
原帖由 ttttstttt 于 2006-7-13 10:11 发表
果然是无意义的讨论。

首先,标准和标准的实现不是一回事。所以上面有人说,“for循环中定义的变量的作用域在编译选项里是可以设置的,标准里是这样说的吗?”没意义。没有哪个标准会规定这种不属于标准范畴的 ...


我们都喜欢扩展,但都不喜欢相悖;既然能称之为扩展,最起码应该向上兼容;
我并不认为for循环的变量外部可见行为是“扩展”,分明就是“相悖”!

如果你的代码有10万行,在dev下编译很正常,连警告都没有,某天必须换到VC下编译,却被告知有366个重定义错误,恰恰你又不知道那个该死的标准开关到底装在哪面墙上,或许像我一样,根本不知道有这么一个开关的存在时,你该怎么办?除了找个润年,每天修复一处错误以外,你还有其他办法吗?到那会你还会认为这种行为是“扩展”吗?
作者: apollolegend    时间: 2006-07-13 13:38
(C)ISO/IEC ISO/IEC 14882:2003(E)
6 Statements  6.5.3 The for statement
[stmt.for] 6.5.3 Theforstatement
1 Theforstatement
for ( for-init-statement condition ; expression ) statement
is equivalent to
{
for-init-statement
while ( condition ) {
statement
expression ;
}
}
except that names declared in the for-init-statement are in the same declarative-region as those declared in
the condition, and except that a continue in statement (not enclosed in another iteration statement) will
execute expression before re-evaluating condition. [Note: Thus the first statement specifies initialization
for the loop; the condition (6.4) specifies a test, made before each iteration, such that the loop is exited
when the condition becomes false; the expression often specifies incrementing that is done after each
iteration. ]

这是03版标准的for循环,在标准的99页,原文是pdf,本想截个图,感觉贴图又麻烦,大家凑乎着看吧
我想说的就是在windows下我用微软的编译器,在posix平台上我用cc或gcc.
ttttstttt兄弟说的不错,我们都应该是不断前进的!
作者: ttttstttt    时间: 2006-07-13 13:56
原帖由 isnowran 于 2006-7-13 13:22 发表


我们都喜欢扩展,但都不喜欢相悖;既然能称之为扩展,最起码应该向上兼容;
我并不认为for循环的变量外部可见行为是“扩展”,分明就是“相悖”!

如果你的代码有10万行,在dev下编译很正常,连警告都没有 ...


请仔细看看标准!
标准中for循环的变量外部是不可见的行为,但在VC6出现的时候还没有C++98标准,所以微软自己定义了for循环的变量行为。从C++98标准出来后,微软再这样实现就是与标准相悖的了,所以在以后的VC版本中(vs2003以后),for循环的变量外部可见行为被修正了,此时与标准一致了。但考虑向后兼容(所谓向上兼容是什么意思?!),因为还有大量的代码是 用VC6写成的。为了保证VC的后继版本能兼容老的代码格式,就设置了这样的编译开关。
作者: ttttstttt    时间: 2006-07-13 14:00
原帖由 lenovo 于 2006-7-13 13:00 发表

>>没有哪个标准会规定这种不属于标准范畴的标准的实现。
这句话是什么意思?


1。这个不属于标准的范畴,
2。标准的实现和标准不是一个意思。
作者: isnowran    时间: 2006-07-13 15:50
不吵了,他们都是伟大的,抽烟去。。。
作者: kuaizaifeng    时间: 2006-07-13 16:28
原帖由 apollolegend 于 2006-7-12 16:03 发表

for循环中定义的变量的作用域在编译选项里是可以设置的,虽然微软独断专行,但对ANSI C++新标准的支持应该是没有问题的。如果你需要最新的C++标准我可以发给你一份,不过是E文的,而且有700多页!



可以发给我一份吗?
kuaizaifeng@gmail.com

谢谢了先
作者: lenovo    时间: 2006-07-13 16:35
原帖由 ttttstttt 于 2006-7-13 14:00 发表


1。这个不属于标准的范畴,
2。标准的实现和标准不是一个意思。

1。“这个”指得是什么?
2。这句话和我们讨论的问题有关系吗?
作者: apollolegend    时间: 2006-07-13 21:41
原帖由 kuaizaifeng 于 2006-7-13 16:28 发表



可以发给我一份吗?
kuaizaifeng@gmail.com

谢谢了先

已发送,请查收!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2