杂七杂八的错误总结
参考
- 微软:Linker Tools Error LNK1168
- csdn博客:vs:严重性代码说明项目文件行错误LNK1168无法打开testes.exe进行写入
- 微软:Compiler Error C2011
- 微软:Linker Tools Error LNK2005
- 百度百科:inline
- csdn博客:C++ Error:C2011: ‘struct’ type redefinition的一般处理方法
- csdn博客:表达式必须包含类类型
- c++ reference:getchar
- c++ reference:string
- csdn博客:strtok、strtok_s、strtok_r 字符串分割函数
- 博客园:C++中string、char *、char[]的转换
- 博客园:C++ 判断字符串是否全是数字
- csdn博客:C++保留任意小数点后位数与格式化输出
- csdn博客:VS2015命令行工具X86和X64版本
- 博客园:Visual Studio 2015 命令行编译C/C++程序
- csdn博客:windows常用命令行命令
目录
1. Linker Tools Error LNK1168
确实是因为debug没有完全停止,然后又重新开了一次debug导致的。
(1)重启vs
- 重启vs,然后重新debug马上没事。
(2)重启vs后的注意事项
- 用debug的时候,如果要关debug的话,不要直接关掉那个控制台或者那个运行的程序,要回到vs的菜单栏上面点那个
红色的方形
来停止debug。这样的话再一次开始debug的时候就不会弹出LNK1168
了。
2. Compiler Error C2011
这种情况下一般会同时报Linker Tools Error LNK2005错误。
(1)自己定义的identifier跟系统的重复了
系统里面已经定义了一个一样的identifier
,为了避免冲突,把自己定义那个identifier的名字改掉
(2)多次反复include同一个.h文件
按照官网上的做法,有好几种:
① 将函数分开.h和.cpp来写
- 因为一些自定义的函数会直接把实现也写进.h里面来引用,然后每引用一次就会定义一次。因为一个项目里面文件较多,所以引用的次数可能不止一次,所以就会出现问题:同一个函数多次定义。所以要将声明写进.h,实现写进.cpp。
② 在函数前面加上inline
这个方法是我试过,是有效的。而且没那么麻烦,不用分开写。
// 官网的代码
// LNK2005_func_inline.h
inline int sample_function(int k) { return 42 * (k % 167); }
③ 加#ifndef和#endif
在代码开头加上#ifndef
,结尾加上#endif
。尤其是当系统提示class重定义的时候,这个用着很方便。
#ifndef _a_h
#define _a_h
a.h的代码
#endif
④ 删掉重复的头文件
如果文件数目不多的话,可以删掉重复引用的.h文件,确保只引用了一次。
3. 表达式必须包含类类型
在JavaScript里面的写法是this.abc
,但是在c++里面的写法是this->abc
。如果在c++里用了this.abc
,就会报错表达式必须包含类类型。
4. getchar()和string
(1)getchar()
getchar()
是一个个字符读入,包括空格和回车。- 如果在
getchar()
前面还有一个std::cin
或者scanf()
的读入,那么要在std::cin
或者scanf()
的后面多加一个getchar()
,否则原来的getchar()
会把前面输入完之后的\n
读进去。
(2)string
用std::cin
读string时要小心,因为空格和回车都会停下来。如果输入的string里面有空格的话,用getchar()
读就不用担心中间会停掉了。
5. strtok_s()
- 如果要按照特定
分隔符
(例如,空格、冒号、tab…)分割字符串,可以用现成的函数strtok_s()
或者strtok_r()
。 - 不要用
strtok()
函数,因为这是不安全的函数,编译的时候会要求替换成_s
或者_r
的。 - 使用方法:strtok、strtok_s、strtok_r 字符串分割函数
- strtok_s()的返回值是
char*
类型的,如果要转成string
类型可以参考:C++中string、char *、char[]的转换
6. stringstream
用stringstream实现int
转string
等等数字转字符串或者反过来的情况是很方便的,但是要留意返回值。如果string包含了不是数字的字符的话,转成int就会出错,所以转的时候判断一下。尤其是读入数据时读进了\n
的时候,如果没有判断它不是数字直接返回一个数的话,会出现一个很大的复数。栽了很多次!
#include<iostream>
#include<sstream>
using namespace std;
int main() {
string str;
stringstream os;
os << str;
int num;
// 是数字
if (os >> num) {
return num;
}
// 不是数字
if (!(os >> num)) {
return false;
}
}
7. 输出格式化的小数
保留5位小数
#include<iostream>
#include<iomanip>
#include "stdlib.h"
using namespace std;
int main(){
//double PI=3.1415926;
double a=100;
cout<<setiosflags(ios::fixed)<<setprecision(3)<<a<<endl;
system("pause");
return 0;
}
// ---------------------
// 作者:RayKevin
// 来源:CSDN
// 原文:https://blog.csdn.net/RayKevin/article/details/53152154
// 版权声明:本文为博主原创文章,转载请附上博文链接!
8. 用vs的命令行编译器编译
如果只是想编译一个.cpp文件,但又不想创建project的话,可以用命令行编译。
开始——microsoft visual studio——x64兼容工具命令提示
进到对应的文件目录下:windows常用命令行命令
① 编译命令,一定要输入/EHsc
cl xxx.cpp /EHsc
② 运行命令,直接输入编译好的文件的名字,不用输入扩展名
xxx