![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
困了就喝白茶
街边太多人与车,繁华闹市人醉夜
展开
-
C++源文件中互相引用对方的头文件没问题的
小白来了个疑问:有没有A.cpp include B.h B.cpp include A.h的 ?这样做可行吗?大佬:可以,我给你举个栗子大佬:你的意思是cpp文件互相用到了对方h文件里的内容 吗?是的//////////////////////////a.hclass B;class A{ A(B* pb); B* pb_;};///////////////////////////a.cpp#include "b.h"#include "a.h"A::A(B* pb)原创 2021-06-10 10:16:10 · 317 阅读 · 5 评论 -
获取当前程序路径的方法C++和C#的做法
C#方法一: string exePath = System.AppDomain.CurrentDomain.BaseDirectory; Console.WriteLine(string.Format("exePath:{0}", exePath));运行的结果为exePath:E:\dingdingDownload\DR2800_Print_TSN\DR2800_Print_TSN\bin\Debug\方法二:string path = System.IO.Directory.GetCu原创 2021-05-29 15:56:28 · 1218 阅读 · 8 评论 -
咋们不是个成熟的程序员那不得学会打印日志和捕抓出错?
杂谈刚刚入行不久,想得太简单,出错了也知道哪里的问题,思维不够严密。加班熬夜少不了,写代码两小时,调试两整天。怀疑别人写的代码有问题,怀疑别人写的借口有问题,甚至于怀疑编译器。因为没有打印日志而选择弹框报错,报错信息不详尽,哪里出问题都不知道;没有catch错误,挨批了。我还以为catch C#才有的。如何打印日志在接口调用位置打日志在关键函数位置打日志在线程进程位置打日志在句柄位置打日志在关键信息的位置打日志在数据库调用的位置打日志在你怀疑的地方打日志 总之我们的程序运行情况也全都依原创 2021-04-18 17:33:18 · 137 阅读 · 2 评论 -
给大忙人们整理的一份结构体内存说明书
你是不是一直这样觉得结构体的内存大小,就是每个不同类型变量的大小之和?你在刚刚接触链表的时候,是不是觉得很奇怪?为什么定义了一个节点的指针,却不能直接用呢?为什么要nodenewnode=(node)malloc(sizeof(node))这样声明一个节点指针呢?或是说你是否听说过结构体内存对齐呢? 你是否见过一些代码将一个char*类型强制转换为结构体类型的代码呢,而认为别人写错了。先说结构体内存对齐的概念为什么要内存对齐?1.其实结构体内存对齐是拿空间换取时间的做法。提高效率CPU把内.原创 2021-04-16 10:27:20 · 92 阅读 · 0 评论 -
MFC中设置定时器SetTimer与OnTimer以及KillTimer
SetTimer函数作用:用于创建一个计时器,KillTimer函数用于销毁一个计时器。计时器属于系统资源,使用完应及时销毁。函数原型:_AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent, UINT nElapse, void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD))参数:参数nIDEvent指定一个非零的定时器ID。参数nElapse指定间隔时间,单位为毫秒。原创 2021-04-15 14:46:49 · 2232 阅读 · 1 评论 -
MFC中MultiByteToWideChar和WideCharToMultiByte
MultiByteToWideChar作用:可以映射一个字符串到一个宽字节(Unicode) 的字符串 .由该函数映射的字符串没必要是多字节字符组。函数原型:intWINAPIMultiByteToWideChar( _In_ UINT CodePage, _In_ DWORD dwFlags, _In_NLS_string_(cbMultiByte) LPCCH lpMultiByteStr, _In_ int cbMultiByte, _Out_wri原创 2021-04-14 19:37:42 · 527 阅读 · 0 评论 -
C/C++strlen与sizeof的区别
strlen函数原型:size_t strlen(char const* _Str ); //size_t就是无符号整型sizeof函数原型:size_t sizeof(类型\对象\);//size_t就是无符号整型他们的区别如何?先看例子:#include <stdio.h>#include <string.h>int main(){ char buf[100]; sprintf(buf, "hello"); printf("strlen: %d原创 2021-04-14 10:11:57 · 242 阅读 · 1 评论 -
使用OutputDebugString输出调试信息
为什么要用它在编写控制台程序的时候我们经常会使用printf输出调试信息,使我们了解程序的状态,方便调试,但是当编写非控制台程序的时候这种方法就行不通了。OutputDebugString它是属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了,很方便。他可以把调试信息输出到编译器的输出窗口。OutputDebugString函数原型:这个是源码下复制来的void WINAPI OutputDebugString( __in_opt LPCTSTR lpOutpu原创 2021-04-14 09:46:18 · 639 阅读 · 0 评论 -
WriteConsole操作系统中有控制台写函数
WriteConsole函数原型:BOOL WriteConsoleA( HANDLE hConsoleOutput, CONST VOID* lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved); 参数说明:句柄,可以通过函数GetStdHandle获得。指针指向缓冲区。缓冲区大小。输出的实际大小保留位,设置为0或原创 2021-04-14 09:39:05 · 470 阅读 · 0 评论 -
Windows Sockets下网络编程的函数与套路详解
套接字(socket)AF_INET 网际域—windows sockets只支持一个通信区域(地址族)。套接字类型:流式套接字(SOCK_STREAM) 提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。实际基于TCP实现。数据报式套接字(SOCK_DGARM)提供无连接服务。数据包以独立包形式发送,不提供无差错保证,数据可能会丢失或重复,并且接收顺序混乱,实践基于UDP实现。原始套接字(SOCK_RAW)主机字节序与网络字节序主机字节序:主机字节序是混乱原创 2021-04-12 18:32:29 · 525 阅读 · 0 评论 -
C++bug之未加载wkernelbase.pdb以及bug:未经处理异常----上班2天修复的bug
问题如下:未加载wkernelbase.pdb以及bug以及未经处理异常吐槽一下这个bug我找了两天了,上班也没干事,刚刚来公司没多久,刚刚接触使用动态库,我每次调用他们的库都会出错。我一直怀疑我dll的隐式调用有问题,我写了一篇文章验证,并且上传了C++项目调用C#、C++接口到我的博客。我调用的方法很nice,可是老是出错,如上面的bug。产生问题的原因:dll中调用了dll,我只加入了我看到的dll;它dll中调用的一堆dll我没加进去。解决办法:把所有的dll都加工程目录中去。以原创 2021-04-08 21:31:49 · 3746 阅读 · 1 评论 -
C++创建和调用动态库DLL的具体做法
1.创建动态库1.新建选择空白的项目。2.然后新建动态库的头文件(.h)和源文件(.cpp)。3.右键项目属性,打开属性面板,配置类型选择动态库dll4.开始写头文件,然后右键项目属性,打开属性面板。->C/C+±>预处理器->预处理器定义中添加TESTDLL#pragma once#ifdef TESTDLL#define APIDLL extern "C" _declspec(dllexport) #else#define APIDLL extern "C"原创 2021-04-07 12:47:14 · 332 阅读 · 0 评论 -
Win32中MFC中的CStdioFile类
CStdioFile类它是继承CFile类的class CStdioFile : public CFile,为什么需要一个CStdioFile类,封装来封装去不麻烦的吗,我一开始是这样想着的。我第一次看到这个类是在看公司前辈们的代码,他们写日志文件的都用这个类的,然后我去了解了一下它。CStdioFile类的作用CStdioFile继承了CFile,是CFile的子类,扩展了文本文件的操作,认识回车换行字符,可以进行一行字符串的读写。WriteString()和ReadString()是它特有的函数原创 2021-03-31 12:46:02 · 464 阅读 · 0 评论 -
strstr() 、strcpy() 、strcat()、 strcmp() 和其他相关函数以及一些问题的出现
strstr()函数原型:char*strstr(char*const str1, const char*const str2);功能:函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL例子:#include <iostream>#include <string.h>using namespace std;int main(){ cha原创 2021-03-31 00:13:25 · 352 阅读 · 0 评论 -
C++11特性之auto关键字
什么是C++11简单的来说就是2011指定的C++标准。该标准在 C++ 98 的基础上修正了约 600 个 C++ 语言中存在的缺陷,同时添加了约 140 个新特性,这些更新使得 C++ 语言焕然一新。C++ auto类型推导C++11赋予auto关键字新的含义,使用它可以编译器在编译期间自动推导出变量的类型。auto关键的基本语法如下auto name = value;name是变量名,value是它初始化的值。来一个auto简单的例子:#include <iostream>原创 2021-03-27 17:27:45 · 405 阅读 · 0 评论 -
C++类的默认构造函中,细数你所不知道的细节
1.一般情况下编译器会为类生成一个默认无参构造函数如图,定义了一个空的类Man,下面主函数,声明了一个Man对象man,运行编译器没报错。证明编译器是给我们创建了一个默认的无参构造函数2.当我们为类创建了一个有参构造后,编译器不会为我们生成默认无参构造了Man man;这样的声明方式编译器报错了。证明编译器没有为我们生存默认的无参构造函数。如果需要用到无参构造函数,只能我们自己写一个无参构造了3.如果不想编译器为我们生成默认构造函数,我们可以这样拒绝把无参构造函数写到private下,这原创 2021-03-26 15:44:23 · 133 阅读 · 0 评论 -
你真的了解MFC的窗口机制了吗,请看下面的题
图1:图2图3图4图5原创 2021-03-26 14:42:20 · 92 阅读 · 0 评论 -
Windows下保证应用程序只有一个运行实例的方法C++实现
第一个程序的代码#include <iostream>#include <Windows.h>using namespace std;//线程1DWORD WINAPI Fun1Proc(LPVOID lpParameter);//线程2DWORD WINAPI Fun2Proc(LPVOID lpParameter);int tickets = 100;HANDLE hMutex;int main(){ HANDLE hThread1; HAND原创 2021-03-15 11:46:01 · 374 阅读 · 0 评论 -
Windows利用互斥对象实现线程同步---买火车票的案例
/*利用互斥对象实现线程同步*/#include <iostream>#include <Windows.h>using namespace std;//线程1DWORD WINAPI Fun1Proc(LPVOID lpParameter);//线程2DWORD WINAPI Fun2Proc(LPVOID lpParameter);int tickets = 100;HANDLE hMutex;int main(){ HANDLE hTh原创 2021-03-15 11:25:07 · 155 阅读 · 0 评论 -
Windows下的UDP客户端的C++实现
Windows下的UDP客户端C++实现,跟前面的TCP UDP很像,前面的文章有详细解析#pragma comment(lib, "Ws2_32.lib")#include <iostream>#include <Winsock2.h>#include <Ws2tcpip.h>using namespace std;/*UDP Client*/int main(void){ //1.加载套接字库 WORD wVersionReq原创 2021-03-12 17:23:22 · 1326 阅读 · 0 评论 -
Windos下的UPD服务器端的C++实现
UPD服务端的代码,稍微改下参数就可以用了#include <iostream>#include <Winsock2.h>#include <Ws2tcpip.h>#pragma comment(lib, "Ws2_32.lib")using namespace std;/*UDP server*/int main(void){ //1.加载套接字库 WORD wVersionRequested; WSADATA wsaData;原创 2021-03-12 16:41:02 · 266 阅读 · 0 评论 -
vs2017TCP客户端C++实现
在上一篇的服务器写了详细的注释#pragma comment(lib, "Ws2_32.lib")#include <Winsock2.h>#include <Ws2tcpip.h>#include <iostream>int main(){ //1.加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1, 1); err原创 2021-03-12 16:03:38 · 568 阅读 · 0 评论 -
VS2017下的C++写的TCP服务器端程序
TCP都是差不多的可以直接套用,稍微改一下数据就行了#pragma comment(lib, "Ws2_32.lib")#include <iostream>#include <Winsock2.h>#include <WS2tcpip.h>//#include "pch.h"/*TCP的服务器端程序*/int main(){ //加载套接字库 WORD wVersionRequested; //用于保存WinSock库的版本号原创 2021-03-12 13:52:43 · 803 阅读 · 0 评论 -
vs2017编写tcp的问题:LNK2019 无法解析的外部符号 __imp__accept@12,该符号在函数 _main 中被引用
在写tcp会产生的错误,如上图。解决方案加一个预编译指令#pragma comment(lib, “Ws2_32.lib”)在cpp的开头原创 2021-03-12 11:16:36 · 1024 阅读 · 1 评论 -
const char*和char *const
1.const char*const在指针前:修饰常量-- - 指向常量的指针 指针指向可以改,指针指向的值不可以改char ch[5] = "list"; const char* pStr = ch; //pStr = 'w'; error pStr = "hi";提示:虽然不能用pStr去修改它所指向的数组元素的值,但我们可以通过数组变量ch来修改元素的值。应用场景:在定义函数时,利用指针类型来传参数,通常将形参声明为const char*类型,这样就不能利用形参来修原创 2021-03-12 09:08:02 · 1718 阅读 · 0 评论 -
C++多继承带来的二义性问题的解决方案
多继承(菱形或称钻石继承)编程可以带来很多便利,也更贴近生活但也带来很多麻烦#include<iostream>using namespace std;class B1{public: void output();};class B2{public: void output();};void B1::output(){ cout << "call the class B1" << endl;}void B2::output(){原创 2021-03-04 11:31:34 · 433 阅读 · 1 评论 -
超实用的Qt快键
F4 : 在同名的头文件和资源程序文件之间切换F2 : 跟踪光标下的符号,若是变量,可跟踪到变量声明的地方;若是函数体或函数声明,可在两者之间切换Shift+F2: 在函数原型和函数实现之间切换Ctrl+Shift+R:对光标处的符号更改名称,这将替换到所有用到改符号的地方Ctrl+I :为选择的文字自动缩进Ctrl+/: 为选择文字进行注释符号或取消注释F1:为光标处查看帮助文原创 2021-01-23 00:41:09 · 191 阅读 · 1 评论 -
每天学习一个C++小技巧之条款07:为多态基类声明为virtual析构函数
本博文以及这个系列的都是我本人观看《Effective C++》的观后感,每天学习一个改善自己C++的一个小技巧。条款07:为多态基类声明为virtual析构函数多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码,给父类的虚构函数加上关键字virtual。class Animal {public: Animal() { cout << "Animal 构造函数调用!" << endl; } virtual void Speak(原创 2020-12-16 20:28:24 · 66 阅读 · 0 评论 -
每天学习一个改善自己C++的一个小技巧之条款06:若不想使用编译器自动生成的函数,就应该明确地拒绝。
本博文以及这个系列的都是我本人观看《Effective C++》的观后感,每天学习一个改善自己C++的一个小技巧。条款06:若不想使用编译器自动生成的函数,就应该明确地拒绝。上一篇博文提到,如果你没有声明编译器会为你声明默认构造函数、析构函数、赋值操作、拷贝构造函数。某些情况下你希望你产生地对象独一无二,不想给别人赋值与拷贝;你可以这样做class MySelt{public: MySelt() { //.. } ~MySelt() { //.. }private:原创 2020-12-15 21:41:08 · 75 阅读 · 0 评论 -
每天学习一个C++提升的小技巧之条款05:了解C++默默编写并调用了哪些函数
//条款05:了解C++默默编写并调用了哪些函数#include<iostream>using namespace std;class A{ int number;public: A(int n):number(n) //构造函数 { } A(const A& rhs) :number(rhs.number) //拷贝构造函数 { } A& operator = (const A& rhs) //拷贝赋值函数 {原创 2020-12-14 17:01:58 · 78 阅读 · 0 评论 -
每天一个C++提升技巧之条款04:确定对象被使用前已被初始化
#include<iostream>#include<list>/*本博文以及这个系列的都是我本人观看《Effective C++》的观后感,每天学习一个改善自己C++的一个小技巧。条款04:确定对象被使用前已被初始化在c++中读取未被初始化的值会导致不明确的行为,污染正在读取的对象,最终导致不可测的程序行为。而处理这个问题的最佳办法是:永远在使用对象之前先将它初始化。*//** 对于无任何成员的内置类型*/int main() { int x原创 2020-12-13 16:23:40 · 103 阅读 · 1 评论 -
每天学习一个改善自己C++的一个小技巧之条款03:尽可能使用const
/***本博文以及这个系列的都是我本人观看《Effective C++》的观后感,每天学习一个改善自己C++的一个小技巧。**条款03:尽可能使用constconst它允许你指定一个语义的约束(指定一个不该被修改的对象)(就是定义一个常量),而编译器会强制实施这个约束,编译器可以帮助你告诉你的客户改数据不应该被改变。const它可以作用于类外部修饰全部变量或名字空间作用域(namespace)的常量,或是修饰文件、函数、区块作用域(局部)中被声明为static的对象。也可以作用于原创 2020-12-12 20:06:30 · 99 阅读 · 0 评论