C++学习笔记

C++学习笔记

C++调试技巧-以数组方式查看指针

对于下面两个变量:

1
2
int *p = new int[10];
int q[10];

在watch窗口中查看有不同的效果,查看p的时候可以看到一个地址,展开+号只能看p[0]的值;查看q的时候也可以看到一个地址,但是展开+号可以看q[0]-q[9]的值。相比之下q的查看方式比p要方便多了。那么有没有办法以q的方式查看p呢,这就是本文要介绍的一个调试技巧。
首先我们需要写如下两行代码:

1
2
typedef int inta[10];
inta *_int;

然后在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
2
3
4
5
6
7
8
9
10
11
typedef char chara[10];
chara *_char;
typedef short shorta[10];
shorta *_short;
typedef int inta[10];
inta *_int;
typedef float floata[10];
floata *_float;
typedef double doublea[10];
doublea *_double;
...

这样你就可以在调试的时候以数组的方式查看各种类型的数据了,对比在memory窗口看那些天文数字的十六进制数据实在是方便多了。

结构体

加点的赋值方式可以乱序
假设:

1
2
3
4
5
struct s
{
int a;
int b;
};

可以这样赋值:

1
2
3
4
5
struct s s1 = 
{
.b = 1,
.a = 2
};

二进制常量

1
2
3
4
#define LongToBin(n) (((n>>21)&0x80)|((n>>18)&0x40)|((n>>15)&0x20)|((n>>12)&0x10)|((n>>9)\
& 0x08)|((n>>6)&0x04)|((n>>3)&0x02)|((n)&0x01))

#define bin(n) LongToBin(0x##n##l)

当宏参数是另一个宏的时候不展开的解决方式

需要注意的是凡 宏定义里有用’‘#’‘或’‘##’'的地 方宏参数是不会再展开.

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

修改配置

作者

GWJ

发布于

2021-02-04

更新于

2022-12-29

许可协议

评论