C++之路

1.C++中的 “__” 和 “_”,经常会看到有变量、结构体、函数等前后有下划线。

以单下划线(_)表明是标准库的变量

双下划线(__) 开头表明是编译器的变量
  • 结构体赋值
struct __attribute__((packed)) zip_header_t
{
	unsigned int flaf;
	unsigned short version;
	unsigned short type;
};

zip_header_t header{0};
#这里是将 此结构体的第一个属性赋值为0,也就是 int flaf = 0

2.

  • Linux下内存调试工具 Valgrind
    资料链接
  • C++之初始化
    myClass::myClass():a(1),b(1)// 初始化列表,将a,b初始化为1  
    {  
    }

3.cv::Point、cv::Size 等数据类型类

  • point的属性为 x ,y。 size的属性为 width,height
    资料链接

4.boost:program_options

C++ 中设置参数的库,类似于 python 的 parser
("width,w", boost::program_options::value<int>(&boardSize.width)->default_value(7), "Number of inner corners on the chessboard pattern in x direction")
参数width,默认设置为7

5.今天用 VS2019 跑 opencv4.5.5 出现问题。

  • 程序正常运行,但是结束时报错 无可用源,并显示0x00007FF9CC31A9C0 (ntdll.dll)处(位于 Strero_camera.exe 中)引发的异常。
    分析原因,在调用 waitKey(0) 时,会控制 opencv窗口,你没有手动销毁窗口时,它会自动销毁,所以可能是销毁窗口时,内存回收出了问题
    在 waitKey(0) 后加上一句 destroyAllWindows() 就OK了,手动销毁窗口。
    大佬博客

6.今天用cmake3.25编译opencv_contrib4.5.5时,报错


Cannot copy output executable
 
''
to destination specified by COPY_FILE:

没找到原因,cmake换成3.24版本就好了。

7. chrono 库

#include <chrono>    一个处理日期和时间的C++

8.stdafx.h 简介及作用

Stdafx.h”是一个预编译的标题,它包括标准系统的文件,包括文件和特定于项目的文件,这些文件经常被使用,但很少被修改。这减少了编译时间和不必要的处理。
MicrosoftVisualStudio中基本上使用预编译头stdafx.h来让编译器知道曾经编译过的文件,不需要从头编译它。
资料链接

9. ifndef

  • #ifndef 是"if not defined"的简写,是预处理功能(宏定义、文件包含、条件编译)当中的条件编译,在实际开发中可以用于做test或者不同版本的不同适配。
  • ifndef 可以根据是否已经定义了一个变量来进行分支选择,其作用是:
    1.防止头文件的重复包含和编译;
    2.便于程序的调试和移植;

资料链接
这个更好

10. extern “C”

  • extern "C"的真实目的是实现类C和C++的混合编程。在C++源文件中的语句前面加上extern “C”,表明它按照类C的编译和连接规约来编译和连接,而不是C++的编译的连接规约。这样在类C的代码中就可以调用C++的函数or变量等。(注:我在这里所说的类C,代表的是跟C语言的编译和连接方式一致的所有语言)
    添加链接描述

11.memset

memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。
在这里插入图片描述
添加链接描述

12.IMPORT_C & EXPORT_C

IMPORT_C 是一个宏,在 e32def.h 定义,意思是从 DLL 中导入函数。
EXPORT_C 也是一个在 e32def.h 定义的宏,意思是从 DLL 中导出函数。
添加链接描述
今天遇到一个代码

#define XXX EXPORT_C	//EXPORT_C 表示从DLL中导出函数,XXX 可以看成一个标志

XXX void AAA(void);		//把带有XXX标志的函数从DLL中导出,不带XXX的不导出

enum BBB(*arg);

XXX enum CCC(*arg);

13.O_RDWR

读写模式,允许读和写
在这里插入图片描述

int fd = open((string(AVM_GetOEMPath()) + "/avmcamtype").c_str(), O_RDWR);

14.static

浅显易懂的博客

15.timeval

我们在linux平台进行开发时,时间相关的操作基本上都会遇到,本文就对常用的时间相关的结构体、接口进行分析小结。
添加链接描述

16.select()

阻塞方式block,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。使用Select就可以完成非阻塞non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高。select能够监视我们需要监视的文件描述符的变化情况。
添加链接描述
添加链接描述

17.atoi

C语言提供了一系列函数把字符串转换为整数:atoi、atol、atoll和atoq。
添加链接描述

18.snprintf()

C 库函数 int snprintf(char *str, size_t size, const char *format, …) 设将可变参数(…),按照 format 格式化成字符串,并将字符串复制到 str 中,size 是要写入的字符的最大数目,超过 size 会被截断。
添加链接描述

19. #if 1 and #if 0

可以理解为 1 就通过,0 就跳过
添加链接描述

20 stoi()

stoi函数:

将字符串转化为10进制的数

stoi(字符串,起始位置(下标),n进制(默认10进制)),将 n 进制的字符串转化为十进制

stoi(s,0,2) :将二进制的字符串s转化为十进制;

int x=stoi(s);把s转化为十进制的x

21 hashtable.end()

哈希表知识点
哈希表参考资料

  • hashtable.end()
    成员方法end()生成指向容器中最后一个键值对之后位置的迭代器。
  • hashtable.find(target - nums[i])
    find(key)是unordered_map容器中寻找键key对应的值的成员方法。若键key与其值的键值对在容器中存在,则返回一个指向该键值对的正向迭代器,反之则返回一个指向容器中最后一个键值对之后位置的迭代器。
  • if(hashtable.find(key) != hashtable.end())
    查找元素是否在哈希表中的方法

22 导入最基本的库有红线,例如

可能是没有安装编译器,下载安装gcc等可能会解决。
可参考链接

23 使用switch时,最好将case加上{},否则可能会有变量声明问题。

原因好像是在Windows、Linux下编译器不同导致。

switch()
{
	case 1:
	{
		/*code*/
	}
}

24 运算符重载

运算符重载大多数都是作为类的成员函数存在,也就是定义在类内。

25 对指针的理解

指针可以想象成抓娃娃的爪子,通过指针选择你要抓的东西,指针改变,不代表内存里的东西就没了(内存里的东西需要你手动删除或等他被回收),有时候会看见指针的指针作为函数参数,因为他要改变此指针指向的指针,这样不会破坏被指向的指针所指向的内容,可以想象成你用同一个爪子抓起不同的娃娃在函数里操作。

//这里就是通过传入指向链表指针的指针,传入不同的节点来插入,这也是C++指针的优点
//如果这里你用节点的指针,你会破坏此节点在链表中的关系
void add(int v,numeric_item ** pp)
{
    numeric_item * newp = new numeric_item;
    newp -> value_ = v;
    newp -> next_ = *pp;
    * pp = newp;
}

26 string::npos

string::npos 是 C++ 标准库中string类的一个静态常量,表示字符串中没有找到指定的字符或子字符串时的返回值。具体来说,当在字符串中查找字符或字符串时,如果找到了则返回该字符或子字符串的索引,如果没有找到则返回 string::npos ,其值为 -1 .因此,可以将 string::npos 用作字符串查找函数的默认返回值,以便在未找到指定字符串或子字符串时返回一个明确的值。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值