#这篇准备不定期长久更新,实在是win下的坑太多,做个记录方便日后查看。
#有人看到了,觉得特别不爽的热烈欢迎评论补充。
#先准备零散写,碰到什么些什么,积累多了再系统整理。
一.编码大坑
1.在win cmd下用g++直接编译编码格式为utf-8的原文件时,需要原文件中的源码里不能有中文,准确的说遇到的问题是不能cout直接输出中文。只要有中文输出,运行时就会跳过(经过测试不是跳过是因字体编码问题不显示),或者在中文输出后面有cin输入操作会直接跳过之后的所有程序。
一下给一段简单例子说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include<iostream> using namespace std; int main() { cout<<"hello world"<<endl; cout<<"1 pleace enter two number"<<endl; int a, b; cin>>a>>b; cout<<a<<" * "<<b<<" = "<<a*b<<endl; cout<<"你好世界!"<<endl; //这里向外输出中文 cout<<"2 pleace enter two number"<<endl; cin>>a>>b; cout<<a<<" * "<<b<<" = "<<a*b<<endl; return 0; }
win cmd运行结果:
可以看到在输出中文之前的代码都是正常运行,到了输出中文后,就出了问题。
同样的代码在Linux下g++编译utf-8文件,输出中文对程序无任何影响。
Linux下运行结果:
解决方案:在win下把文件编码格式从utf-8转换成cp936,再在win cmd用g++编译就会正常运行。
例如:在vim命令模式下输入:set fileencoding=cp936 然后保存即可。
经验: 在win cmd下编写c++程序最好还是在编码cp936下完成。
在Linux下当然是用utf8了。
未完待续……
二.编译器g++在win和Linux下的不同表现
1.在函数传递字符参数时的不同表现
例如如下代码:
1
2
3string fileName; cin<<fileName; //让用户输入一个文件文件名 ofstream outfile(fileName.c_str(), ios::out); //在传的第一个参数中,在Linux下是需要用string中的.c_str()转换成char<> ,而在win下却不用转换也可以!!!
在Linux下不加.c_str()的结果:
可以看到,是类型转换的问题。然而,在win下不加也可以编译通过正常运行。(这东西书上可不写。。哎,踩坑进行中…)
解决办法:不管是在win还是Linux下还是都要用.c_str()进行转换。
纵然win下是可以通过,理论上还是要转换的,按照规则来吧,win下就当是意外。。
待续……
最后
以上就是懵懂战斗机最近收集整理的关于win cmd下g++编译cpp的那些坑一.编码大坑二.编译器g++在win和Linux下的不同表现的全部内容,更多相关win内容请搜索靠谱客的其他文章。
发表评论 取消回复