LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: realtang

晕倒,VC++不支持C99规范

[复制链接]
发表于 2005-12-14 19:20:37 | 显示全部楼层
这辈子别指望VC++能完全支持C/C++规范,除非微软变成慈善机构或者ISO
ICC这种非通用平台的编译器也就算了吧。
使用这些编译器只会把自己禁锢在某一平台从而进一步成为某集团的潜在奴隶。
回复 支持 反对

使用道具 举报

发表于 2005-12-15 00:33:37 | 显示全部楼层
Post by etflanker
编译信息是什么啊,看看都?
我知道vc6对c99支持不好,。net还是很不错的!!



是不错,没有inline关键字,没有stdint.h头文件,一大堆……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-15 09:10:10 | 显示全部楼层
Post by Illidan
我想启动红旗用icc编出来的内核(workstation 5),却失败了,唉。

毕竟是专业搞Linux的,不像咱们这些非正规军。还是有两把刷子的了。他们那里的论坛人气如何??
回复 支持 反对

使用道具 举报

发表于 2005-12-15 14:42:57 | 显示全部楼层
做人要厚道。
vc6是98年出来的,要是支持C99才真的是见鬼了。
现在又不是没有新的。vc2005大概除了export关键字不支持(目前还没有支持的)其他的c/c++标准都差不多了吧?
回复 支持 反对

使用道具 举报

发表于 2005-12-15 18:24:01 | 显示全部楼层
Post by lucifer
做人要厚道。
vc6是98年出来的,要是支持C99才真的是见鬼了。
现在又不是没有新的。vc2005大概除了export关键字不支持(目前还没有支持的)其他的c/c++标准都差不多了吧?

vc2005不支持C++标准的地方多了去了(除了export):
1、非标准的限制:
比如函数参数个数、模板参数个数限制(标准256个,vc2005是64)。
2、错误的模板实例化点:

  1. template<class T> void foo(T a);
  2. template<> void foo<int>(int a);
  3. void bar()
  4. {
  5.     foo('a');
  6. }
  7. template<> void foo<char>(char a);
  8. int main()
  9. {
  10.     bar();  // foo()应该调用foo<int>,实际调用foo<char>
  11. }
复制代码

3、throw的参数支持错误,只支持all exception和no exception,不支持限定exception,如:
void foo() throw(std::bad_alloc);
相当于
void foo() throw(...);
...

支持export的C++编译器有了,如comeau c++,intel c++ compiler > 8.1等,不过似乎也不会广泛应用。

C99就更别提了,根本就不支持。官方文件写明只支持C95。
回复 支持 反对

使用道具 举报

发表于 2005-12-16 09:33:11 | 显示全部楼层
Post by manphiz
vc2005不支持C++标准的地方多了去了(除了export):
1、非标准的限制:
比如函数参数个数、模板参数个数限制(标准256个,vc2005是64)。
2、错误的模板实例化点:

  1. template<class T> void foo(T a);
  2. template<> void foo<int>(int a);
  3. void bar()
  4. {
  5.     foo('a');
  6. }
  7. template<> void foo<char>(char a);
  8. int main()
  9. {
  10.     bar();  // foo()应该调用foo<int>,实际调用foo<char>
  11. }
复制代码

3、throw的参数支持错误,只支持all exception和no exception,不支持限定exception,如:
void foo() throw(std::bad_alloc);
相当于
void foo() throw(...);
...

支持export的C++编译器有了,如comeau c++,intel c++ compiler > 8.1等,不过似乎也不会广泛应用。

C99就更别提了,根本就不支持。官方文件写明只支持C95。


vc2005根本不支持c99? 呵呵,仔细想想,vc2005至少支持一个c99的标准,就是用//注释......
另外,看看这个http://www.comeaucomputing.com/features.html#stilltocome
说的是 将要 支持export...
回复 支持 反对

使用道具 举报

发表于 2005-12-16 10:48:25 | 显示全部楼层
Post by lucifer
vc2005根本不支持c99? 呵呵,仔细想想,vc2005至少支持一个c99的标准,就是用//注释......
另外,看看这个http://www.comeaucomputing.com/features.html#stilltocome
说的是 将要 支持export...

这个//注释应该算当年的非标准扩展,倒是进入c99标准后名正言顺了 。如此算来,__restrict似乎也可以算一个了。
comeau c++被别的新闻骗了,多谢点明
回复 支持 反对

使用道具 举报

发表于 2005-12-16 12:11:21 | 显示全部楼层
Post by manphiz
这个//注释应该算当年的非标准扩展,倒是进入c99标准后名正言顺了 。如此算来,__restrict似乎也可以算一个了。
comeau c++被别的新闻骗了,多谢点明

这倒是,C99 中的许多新特性都来自最近十年左右各个不同的编译器。所以,gcc 虽然也没有完全支持 C99,它也还是支持一些 C99 中的特性的。

不过,gcc 的目标是在将来完全支持 C99,但 VS .NET 则不是,这就是不同之处了(尽管它可能并不重要)。
回复 支持 反对

使用道具 举报

发表于 2008-1-6 13:02:33 | 显示全部楼层
引用:
作者:manphiz
2、错误的模板实例化点:
代码:
template<class T> void foo(T a);
template<> void foo<int>(int a);
void bar()
{
    foo('a');
}
template<> void foo<char>(char a);
int main()
{
    bar();  // foo()应该调用foo<int>,实际调用foo<char>
}

// ...
不好意思,我认为你这个例子自身就有问题。
首先,特化template<> void foo<char>(char a)申明在调用之后,而函数bar()调用在之前,而编译器会尝试在bar()调用foo时用<char>实例化template<class T> void foo(T a),所以编译器会报错:该特化申明点错误。所以我认为上面的代码不能通过编译,无论是vc2005或者g++都是这个结果。

尝试稍作改动的下面的例子:
template<class T> void foo(T a)
{
        std::cout<<"template<T>: foo";
        std::cout<<"<"
                      <<typeid(T).name()
                      <<">"
                      <<std::endl;
}
template<> void foo<int>(int a)
{
        std::cout<<"template<>: "
                       <<"foo<int>"<<std::endl;
}
void bar()
{
    foo('a');
}
int main()
{
    bar();
}
如果按照你说的现在没有了template<> void foo<char>(char a), 自然应该调用template<> void foo<int>(int a)了,而实际上编译器还是用<char>实例化基础模版得到
template void foo<char>(char), 并调用之。模板实参的推演是精确匹配的过程,而'a'默认是char型的。
这是在下的拙见,不对之处请指出。
回复 支持 反对

使用道具 举报

发表于 2008-1-6 22:50:50 | 显示全部楼层
so old ~~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表