C++学习笔记
C++调试技巧-以数组方式查看指针
对于下面两个变量:
1 |
|
在watch窗口中查看有不同的效果,查看p的时候可以看到一个地址,展开+号只能看p[0]的值;查看q的时候也可以看到一个地址,但是展开+号可以看q[0]-q[9]的值。相比之下q的查看方式比p要方便多了。那么有没有办法以q的方式查看p呢,这就是本文要介绍的一个调试技巧。
首先我们需要写如下两行代码:
1 |
|
然后在watch窗口敲入一行:_int=p
再然后在watch窗口敲入一行:_int[0]
展开_int[0]
的那个+号,显示的是_int[0]—_int[9]的值。而这些值正好就是p[0]—p[9]的值。再敲入_int[1]并展开看看,正好是p[10]—p[19]的值。这样借助一个全局变量,和调试的时候给这个全局变量赋值,我们就可以用数组的方式查看一个指针了。
推荐在工程里加入一个temp.h,这个cpp的内容大致如下:
1 |
|
这样你就可以在调试的时候以数组的方式查看各种类型的数据了,对比在memory窗口看那些天文数字的十六进制数据实在是方便多了。
结构体
加点的赋值方式可以乱序
假设:
1 |
|
可以这样赋值:
1 |
|
二进制常量
1 |
|
当宏参数是另一个宏的时候不展开的解决方式
需要注意的是凡 宏定义里有用’‘#’‘或’‘##’'的地 方宏参数是不会再展开.
1, 非’‘#’‘和’‘##’'的情况
#define TOW (2)
#define MUL(a,b) (a*b)
printf(“%d*%d=%d\n”, TOW, TOW, MUL(TOW,TOW));
这行的宏会被展开为:
printf(“%d*%d=%d\n”, (2), (2), ((2)*(2)));
MUL里的参数TOW会被展开为(2).
2, 当有’‘#’‘或’‘##’'的时候
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
//printf(“int max: %s\n”, STR(INT_MAX)); // INT_MAX #include
这行会被展开为:
printf(“int max: %s\n”, “INT_MAX”);
printf(“%s\n”, CONS(A, A)); // compile error
这 一行则是:
printf(“%s\n”, int(AeA));
INT_MAX和A都 不会再被展开, 然而解决这个问题的方法很简单. 加 多一层中间转换宏.
加这层宏的用意是把所 有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就 能得到正确的宏参数.
#define A (2)
#define _STR(s) #s
#define STR(s) _STR(s) // 转 换宏
#define _CONS(a,b) int(a##e##b)
#define CONS(a,b) _CONS(a,b) // 转 换宏
printf(“int max: %s\n”, STR(INT_MAX)); // INT_MAX,int型的最大值,为一个变量 #include
输出为: int max: 0x7fffffff
STR(INT_MAX) --> _STR(0x7fffffff) 然 后再转换成字符串;
printf(“%d\n”, CONS(A, A));
输 出为:200
CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2))
C++ STL容器存的是实体还是引用
容器存的是实体而不是引用
https://blog.csdn.net/naughfy/article/details/79602555
GDB之显示数组
https://blog.csdn.net/jinhui_wen/article/details/42424349
CLION
Error during pretty printers setup: Undefined info command: “pretty-printer”.
https://www.cnblogs.com/fanlumaster/p/14207455.html
MinGW
https://sourceforge.net/projects/mingw-w64/files/
https://blog.csdn.net/didi_ya/article/details/111240502