体验C++0x,奇怪编译错误

老邓 2009-05-03 08:26:58
MinGW TDM 4.4 编译器,测试C++0x的功能特性:添加-std=c++0x编译选项。
代码:
// #include <iostream> // 如果包含该文件,则编译错误,否则一切正常!
#include <stdio.h>
#include <vector>

int main(int argc, char **argv)
{
std::vector<int> v;
v.push_back(11);
v.push_back(22);
v.push_back(33);

for (auto i = 0; i < 10; i++)
{
printf("%d\n", i);
}

for (auto iter = v.cbegin(); iter != v.cend(); ++iter)
{
printf("%d\n", *iter);
}

return 0;
}

如果包含iostream头文件或memory头文件,则编译错误,否则一切正常!

错误信息:
d:\qpdev\gcc\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:159: error: '::swprintf' has not been declared
d:\qpdev\gcc\bin\../lib/gcc/mingw32/4.4.0/include/c++/cwchar:166: error: '::vswprintf' has not been declared

搜索网络未果。
有兴趣的朋友帮忙尝试下,看能否解决。(注:MinGW4.3也如此,过一会我到Ubuntu下测试看看)
...全文
1048 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
老邓 2009-05-28
  • 打赏
  • 举报
回复
找到更好的解决方案:不使用-std=c++0x,改用-std=gnu++0x,问题即可解决。

真的很奇怪,不知道有没有反馈这个bug的。等一会我查一下,如果没有的话,我反馈一下。
老邓 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zbzpo2002 的回复:]
这么写能编译过


#ifdef __STRICT_ANSI__
#undef __STRICT_ANSI__
#endif
#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;


int main(int argc, char **argv)
{
std::vector <int> v;
v.push_back(11);
v.push_back(22);
v.push_back(33);

for (auto i = 0; i < 10; i++)
{
printf("%d\n", i);
}

for (…
[/Quote]
谢谢!
现在是这么干的。
想过改头文件:不过牵涉的问题比较多,看来只能等官方修正了。
zbzpo2002 2009-05-22
  • 打赏
  • 举报
回复
这么写能编译过


#ifdef __STRICT_ANSI__
#undef __STRICT_ANSI__
#endif
#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;



int main(int argc, char **argv)
{
std::vector<int> v;
v.push_back(11);
v.push_back(22);
v.push_back(33);

for (auto i = 0; i < 10; i++)
{
printf("%d\n", i);
}

for (auto iter = v.cbegin(); iter != v.cend(); ++iter)
{
printf("%d\n", *iter);
}

return 0;
}
老邓 2009-05-10
  • 打赏
  • 举报
回复
找到解决方法:
发现gcc4.3.3已经全面支持tr1了,就去下了个tdm版本. 结果发现最简单的程序tr1程序都编译不了.

error: '::swprintf' has not been declared

error: '::vswprintf' has not been declared

看了头文件发现这两个函数被__STRICT_ANSI__宏隔离了.而打开std=c++0x

编译选项导致__STRICT_ANSI__被定义. 就找不到这两个函数了.



后来又Google了一下,发现这两个函数被:

2008-07-04 Danny Smith dannysmith***@***users,sourceforge.net

include/stdio.h (swprintf, vswprintf): Guard with #ifndef __STRICT_ANSI__ include/wchar.h



所以解决方法很简单, 加上编译时加上U__STRICT_ANSI__或者直接改头文件就OK.
老邓 2009-05-03
  • 打赏
  • 举报
回复
用这个编译版本即可:
http://cboard.cprogramming.com/tech-board/114279-gcc-4-4-0-released.html
and the downloads is:http://cyberfish.wecheer.com/mingw32.7z
老邓 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 taodm 的回复:]
没啥奇怪的。gcc一直在windows不能支持unicode,说是windows的api的内部bug。
但是vc和bcb都绕过了这个bug。
自己禁掉这几个函数就可以了。
[/Quote]
你的观点过时了哈。从4.3开始,对Unicode已经支持的很好了。
是TDM编译的版本有问题。
我正在尝试使用另一编译版本:已经编译通过。
下面准备自己编译4.4
jackyjkchen 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 taodm 的回复:]
没啥奇怪的。gcc一直在windows不能支持unicode,说是windows的api的内部bug。
但是vc和bcb都绕过了这个bug。
自己禁掉这几个函数就可以了。
[/Quote]

所以说,我很少用移植软件,还是原生软件好……外来的东西总是会水土不服的
taodm 2009-05-03
  • 打赏
  • 举报
回复
没啥奇怪的。gcc一直在windows不能支持unicode,说是windows的api的内部bug。
但是vc和bcb都绕过了这个bug。
自己禁掉这几个函数就可以了。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Loaden 的回复:]
在Ubuntu下试用GCC4.3.3,结果一切正常!我晕!!
看来应该是MinGW的问题。

[/Quote]呵呵~~来看看
jackyjkchen 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 BuleRiver 的回复:]
vector有cbegin()和cend()成员函数吗?
begin()和end()返回迭代器,不是auto int.
下面的代码在VC6下能正常通过

C/C++ code
#include <iostream>
#include <stdio.h>
#include <vector>

int main(int argc, char **argv)
{
std::vector<int> v;
v.push_back(11);
v.push_back(22);
v.push_back(33);

for (auto i = 0; i < 10; i++)
{
printf("%d\n", i);
}


[/Quote]
呵呵,人家讨论C++ 0x标准,VC6连C++99都不支持……
BuleRiver 2009-05-03
  • 打赏
  • 举报
回复
vector有cbegin()和cend()成员函数吗?
begin()和end()返回迭代器,不是auto int.
下面的代码在VC6下能正常通过

#include <iostream>
#include <stdio.h>
#include <vector>

int main(int argc, char **argv)
{
std::vector<int> v;
v.push_back(11);
v.push_back(22);
v.push_back(33);

for (auto i = 0; i < 10; i++)
{
printf("%d\n", i);
}

std::vector<int>::iterator iter;
for (iter = v.begin(); iter != v.end(); ++iter)
{
printf("%d\n", *iter);
}

return 0;
}
老邓 2009-05-03
  • 打赏
  • 举报
回复
在Ubuntu下试用GCC4.3.3,结果一切正常!我晕!!
看来应该是MinGW的问题。

#include <iostream>
#include <memory>

template <typename T>
struct identity
{
typedef T type;
};

template <typename T>
T&& forward(typename identity<T>::type&& a)
{
return a;
}

int main(int argc, char **argv)
{
std::shared_ptr<int> sp(new int(10));
std::cout << *sp << std::endl;

return 0;
}
lzh9955 2009-05-03
  • 打赏
  • 举报
回复
奇怪,up
lpf000 2009-05-03
  • 打赏
  • 举报
回复
把 <stdio.h>改成<cstdio> 看看。。
jackyjkchen 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Loaden 的回复:]
引用 3 楼 jackyjkchen 的回复:
对了,楼主把stdio.h和iostream换一下位试试
一样的。
[/Quote]

会不会,C++ 0x标准里强制用户不能将C与C++混编,你再试试用cstdio代替stdio.h
Paradin 2009-05-03
  • 打赏
  • 举报
回复
奇怪,up
老邓 2009-05-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jackyjkchen 的回复:]
对了,楼主把stdio.h和iostream换一下位试试
[/Quote]一样的。
mengde007 2009-05-03
  • 打赏
  • 举报
回复
去试试看;
  • 打赏
  • 举报
回复
观望。。
jackyjkchen 2009-05-03
  • 打赏
  • 举报
回复
对了,楼主把stdio.h和iostream换一下位试试
加载更多回复(2)

64,282

社区成员

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

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