C/C++
文章平均质量分 65
周健文
这个作者很懒,什么都没留下…
展开
-
VS2019/VC++单文件编译配置
由于VS不支持C/C++单文件编译,只是学习或测试用的单个C/C++文件也要建个项目,实在是麻烦,所以一般都是选择系统开始菜单VS自带的开发人员命令提示符,手动输入编译命令,这样就可以单文件编译了,但是也还是麻烦。每次需要先打开开发人员命令提示符,然后根据不同的文件路径名输入不同的编译命令,忍了一段时间后,今天终于发现一个比较省心的办法了。先了解一下VS的命令行编译选项:VS 2019的开发人员命令提示符(使用32位x86本机工具来生成32位x86本机代码的环境)目标:%comspec% /k "C转载 2021-08-22 01:39:54 · 2509 阅读 · 1 评论 -
从C++ float* 到 C# 端侧数据接收处理
我有一个DLL,可以导出一个返回float *的函数,我想在我的 C# 代码中使用它。我不确定如何对我的 float *进行编组,以便可以在 C# 中安全地使用它。因此,在我的C ++ DLL中,我声明了:static float* GetSamples(int identifier, int dataSize);C#脚本:[DllImport ("__Internal")]public static extern float[] GetSamples (int identifier, int原创 2021-02-21 23:50:21 · 1351 阅读 · 0 评论 -
C#对数据库的各种操作
1、数据库连接(1)连接SQL Server数据库SqlConnection con = new SqlConnection("Server=XIAOKE;uid=sa;pwd=;database=db");(2)连接Windows身份验证的SQL Server数据库SqlConnection con = new SqlConnection("Server=XIAOKE;Initial Catalog =db;Integrated Security=SSPI;");(3)连接2003及以下版本原创 2020-12-31 14:42:22 · 3481 阅读 · 0 评论 -
warning: ISO C++11 does not allow conversion from string literal to ‘char *‘
string类型与char const *类型在做书上的例题是遇到如下问题:int main(int argc,char *argv[]){ char *pch = "abc"; // caution:ISO C++11 doesn't allow conversion from string literal to 'char*' cout<<pch<<endl; cout<<(void*)pch<<endl; retur原创 2020-08-31 13:48:43 · 2692 阅读 · 0 评论 -
std:move基本用法和理解
场景:C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意是想把参数push_back进去就行了.C++11 提供了std::move 函数来把左值转换为右值, 而且新版的push_back也支持&&参数的重载版本,这时候就可以高效率的使用内存了.对指针类型的标准库对象并不需要这么做.参考:Move Constructors and Move Assignment Operat翻译 2020-08-30 14:41:13 · 27529 阅读 · 1 评论 -
深入浅出移动构造函数与move之间的关系
首先看一个小例子:#include <iostream>#include <cstring>#include <cstdlib>#include <vector>using namespace std;int main(){ string st = "I love xing"; vector<string> vc ; vc.push_back(move(st)); cout<<vc[0]转载 2020-08-25 00:35:07 · 416 阅读 · 0 评论 -
const和宏定义的区别
宏的命名规范:一般以项目前缀开头,key结尾。#开头表编译。宏的用法:定义常用字符串。定义一段代码。const与宏的区别:编译时刻:宏-预编译 const-command+b(编译阶段)编译。宏不会检查代码错误,只是替换,但是const会编译报错。宏的好处:定义代码或字符串、方法、参数 const不能。坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换。const作用:限制类型const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p)被const修饰的变量原创 2020-08-24 00:21:25 · 2355 阅读 · 0 评论 -
char str[] 与 char *str的区别详细解析
char* get_str(void){ char str[] = {"abcd"}; return str;}char str[] = {“abcd”};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址。此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的。char* get_str(void){ char *str = {"abcd"}; r原创 2020-08-22 19:17:48 · 1344 阅读 · 0 评论 -
C++面试基本知识点总结
进制的转换二进制转10进制,1000101 从右往左从2的0次方开始,相乘。二进制转8进制,三个一组同样成2的次方,结果依次排序;二进制转16,四个一组,同上;十进制转2进制/2,转16进制/16,转8进制/8;八进制转2进制,每个数字拆开/2,分成三个一组,不足补0;十六进制转2进制,每个数字拆开/2,分成4个一组,不足补0;位运算符和逻辑运算符&符号,相同为1有0为0;||有1为1,相同为0 ; ^,相同为0,不同为1;~求补,只作用于二进制,每个数取反,1变0,0变1; &l原创 2020-08-21 16:36:24 · 1615 阅读 · 0 评论 -
如何智能地在每个数字中间加一个逗号?
头尾部都没有’,'符号,用C语言实现。我感觉用if感觉太复杂了,有没有更简单的?例如:输入:a[6]={1,2,3,4,5,6}输出:1,2,3,4,5,6下面是"谷雨同学"的回答,挺值得回味的:#include <stdio.h>int main(void) { int a[6] = {1, 2, 3, 4, 5, 6}, i; for (i = 0; i < 6; i++) { printf(",%d" + !i, a[i]);原创 2020-08-21 14:02:20 · 4374 阅读 · 0 评论 -
不依赖计算长度去遍历数组
本文介绍如何遍历函数指针数组的方法。在一个u-boot源码中看到,分享给大家。利用函数指针数组最后的空指针作为判断结束。函数指针数组定义:typedef int (init_fnc_t) (void);init_fnc_t *init_sequence[] = { env_init, /* initialize environment */ init_baudrate, /* initialze baudrate settings */ serial_init, /* seri原创 2020-08-21 13:23:51 · 335 阅读 · 0 评论 -
如何在不修改类成员属性的情况下,访问类的私有成员?
成员函数、友元类,友元函数,甚至通过指针。通过内存地址直接去访问private只在编译时有效,编译后class被处理成一个结构运行并没有额外的机制去检查成员的访问权限。最常用的方法应该是增加公共成员函数去访问,这是最容易想到的,这是标准做法,满足c++的封装特性;高级做法用友元类和友元方法;牛人做法用指针内存访问读取(类指针+地址偏移量),但是使用这种方式容易导致很多野指针的问题。...原创 2020-08-18 17:06:58 · 402 阅读 · 0 评论 -
跨平台睡眠函数
实现#include <chrono>#include <thread>#define msleep(msec) std::this_thread::sleep_for(std::chrono::milliseconds(msec))引用文档:https://en.cppreference.com/w/cpp/thread/sleep_for更多介绍Windows与Linux系统间睡眠函数的实现推文:《跨平台sleep,msleep,usleep兼容性问题》介绍Q原创 2020-08-11 17:23:21 · 218 阅读 · 0 评论 -
qt5.14.2 该文件包含不能在当前代码页(936)中表示的字符
warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。忽略警告,但是问题还在(1)找出警告的文件,然后在该文件的开始处加入下面的语句:#pragma warning (disable:4819)(2)如果是 VS IDE,还可以:在Project -> Properties -> Configuration Properties -> C/C++ -> Advance 的 Disable Spe原创 2020-08-08 19:02:34 · 9839 阅读 · 0 评论 -
C/C++之内存对齐
1、什么是内存对齐计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小#include <stdio.h>struct A{ char a; int b;}; int main(){ printf("size of struct A is %d\n", sizeof(struct A)); return 0;}结果:1111deMacBook-Pro:digui转载 2020-08-07 12:51:03 · 334 阅读 · 0 评论 -
C++智能指针和普通指针参数的使用问题
void*(或PVOID)转string 定时器使用char * str = (char *)pvArgToCompletionRoutine; string ss=str; 内存泄漏:给一个对象申请一块内存空间,由于某种原因这块内存未释放掉,这块内存被占用导致应用卡顿等。 内存溢出:拥有一块20字节的内存空间,你将30字节的文件写入其中,就会造成溢出。 string的内存管理是由系统处理,除非系统内存池用完,不然不会出现这种内存问题。 char *的内存管理由用户自己处理,很容易出现内存不足的问题。原创 2020-08-03 20:00:44 · 804 阅读 · 0 评论 -
仿函数与Lambda表达式学习笔记
#include <iostream>#include <vector>#include <functional>#include <algorithm>using namespace std;//STL=算法+数据结构class Add {public: Add(int temp) :m_x(temp) { } int operator()(int a, int b) { return a + b+m_x; }private原创 2020-07-31 13:24:42 · 128 阅读 · 0 评论 -
右值引用与模板学习笔记
右值引用与模板(一):左值、右值概念辨析与C++11右值引用#include <iostream>using namespace std;int main1(void) { //左值:可以出现在赋值运算符左边 //右值:所谓的数据 /*int a = 10; int b = 20;*/ //int c = a + b; //int a + b = 20; //左值:往往代表的一个存储空间 //右值:由于这个a+b涉及到了计算机空间,仅仅能够在这个表达式 //运行过程中存在原创 2020-07-31 13:13:43 · 299 阅读 · 0 评论 -
使用C++11解决内存泄露的问题(shared_ptr共享智能指针)
shared_ptr共享的智能指针原创 2020-07-25 15:39:43 · 1103 阅读 · 0 评论 -
多线程实现生产者和消费者(同步队列)以及线程异步操作async
传统的生产者消费者模型生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。但是,这个共享数据区域中应该具备这样的线程间并发协作的功原创 2020-07-16 17:46:02 · 1357 阅读 · 0 评论 -
优先队列(priority_queue)理解与使用
理解 priority_queue定义:priority_queue<Type, Container, Functional>Type 就是数据类型。(int ,double等)Container 就是容器类型(Container必须是用数组实现的容器,默认vector,但不能用 list)Functional 就是比较的方式(可以自定义,默认从小到大排序)这三个参数,后面两个可以省略,第一个不可以。对于这个模板类priority_queue,它是STL所提供的一个非常有效的容原创 2020-07-16 12:54:31 · 658 阅读 · 0 评论 -
右值引用优化性能,避免深拷贝
内存泄露对于含有堆内存的类,我们需要提供深拷贝的拷贝构造函数,如果使用默认构造函数,会导致堆内存的重复删除,比如下面的代码:class A{public: A():m_ptr(new int(0)) { } ~A() { delete m_ptr; }private: int* m_ptr;};A Get(bool flag){ A a; A b; if (flag) { return a; } else { return b; }}int原创 2020-07-14 18:40:36 · 1323 阅读 · 0 评论 -
移动构造函数和移动赋值运算符的坑
第一坑,隐式声明的移动构造函数和移动赋值运算符 class A{ int * p; public: A(int value): p(new int(value)) {} ~A(){ std::cout<<"delete pointer:"<<(void *)p<<std::endl; //查看析够函数删除了哪个指针 delete p; } }; int m原创 2020-07-14 17:06:35 · 480 阅读 · 0 评论 -
C++11 新特性之右值引用和转移构造函数
问题背景#include <iostream> using namespace std; vector<int> doubleValues (const vector<int>& v) { vector<int> new_values( v.size() ); for (auto itr转载 2020-07-02 16:45:29 · 374 阅读 · 0 评论 -
linux编程快速入门学习笔记
ubuntu开发环境安装gcc/make/gdb更新安装源apt-get update安装gcc和c++的开发库,安装的时候自动包含其它依赖库apt-get install g++调试工具apt-get install gdbapt-get install make远程连接工具apt-get install openssh-server编辑工具apt-get install vim使用gcc/g++编译程序详解gcc(g++)预处理,头文件include、导入库、宏编译,检测语原创 2020-06-23 11:02:21 · 212 阅读 · 0 评论 -
【转载】visual studio包含其它include目录
包含目录 库目录 附加包含目录 附加库目录 附加依赖项https://www.cnblogs.com/cpp-blog/p/11678944.html#include的路径及顺序https://blog.csdn.net/u013635579/article/details/82564246原创 2020-06-21 15:00:04 · 349 阅读 · 0 评论 -
基于google标准的C++编程规范说明
规范的代码可以促进团队合作,规范的代码有助于提升代码的可读性,注释规范自动生成文档。1.头文件规则通常每一个.cpp 文件对应一个.h 文件,当然也有特列,main 函数入口 cpp 文件没有对应的.h, 只有纯虚函数的接口类只有.h 文件没有.cpp。1.1.#define 防止多重包含所有头文件都应该使用#define 防止头文件被多重包含,这个多重包含指的是一个 cpp 编译过程中不被多次包含,如果有多个 cpp 都调用,那这个文件还是会被包含多次,所有头文件中不要做定义。命名格式如果是普通原创 2020-06-18 18:09:44 · 3130 阅读 · 0 评论 -
h、cpp和hpp头文件之间使用区别
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。hpp的优点不少,但是编写中有以下几点要注意:1、是Header Plus Plus 的简写。2、与*.h类转载 2020-05-25 12:06:11 · 11268 阅读 · 0 评论 -
C++之多态与虚函数的实例演示
此实例演示能带你贯穿C++面向对象的抽象、封装、继承和多态性的知识点,还考察了对运算符重载、友元等知识点的运用。共用头文件#ifndef _GLOBAL_H#define _GLOBAL_H#include <string>#include <iostream>#include <vector>#include <algorithm>#include <stack>#include <cmath>#include &原创 2020-05-16 21:59:04 · 248 阅读 · 0 评论 -
秒懂拷贝控制
什么是拷贝构造函数如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。class Foo{public: Foo(); //默认构造函数 Foo(const Foo&); //拷贝构造函数}拷贝、赋值与销毁的基本操作拷贝初始化不仅在我们用=定义变量时会发生,在下列情况下也会发生将一个对象作为实参传递给一个非引用类型的...原创 2020-05-08 02:25:34 · 263 阅读 · 0 评论 -
调用strcpy函数报错的5种解决方法
只要调用strcpy()函数在程序运行时,总是出现错误:error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for d...转载 2020-05-07 14:32:50 · 8752 阅读 · 0 评论 -
图解链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。原创 2020-05-06 22:05:15 · 194 阅读 · 0 评论 -
VS Code配置 Microsoft C++
vscode使用visual studio 2019的MSVC配置C/C++编译环境第一步安装VS Code的C/C++扩展。您可以通过在“扩展”视图(Ctrl + Shift + X)中搜索“ c++”来安装C/C++扩展。在开始第二步之前,确保你已经安装了visual studio 2019的Microsoft Visual C ++(MSVC)编译器工具集。我之前安装了visual ...原创 2020-05-01 19:39:13 · 1170 阅读 · 0 评论 -
函数返回数据的有效期
用函数返回的引用作为新引用的初始化值的方式来调用函数例子1代码和测试结果int& fun5(int c) { int a = c; cout << &a << "," << a << endl; return a;}int main(){ int &b = fun5(10); ...原创 2020-04-29 19:40:05 · 420 阅读 · 0 评论 -
使用非递归构建无限级分类树
现在我们拥有全国的省、市、区、县、镇、街道的行政区域信息表,比如中国>>广东省>>深圳市 >>南山区>>xx街道,请将这些信息构建成一棵树,根节点为全国,叶子节点为街道。...原创 2020-04-28 23:55:55 · 415 阅读 · 0 评论 -
右值引用与模板
左值、右值概念辨析与C++11右值引用#include <iostream>using namespace std;int main(void){ //左值:可以出现在赋值运算符左边 //右值:所谓的数据 int a = 10; int b = 20; int c = a + b; //int a + b = 20; //左值:往往代表的一个存储空间 //右值:...原创 2020-04-22 18:52:04 · 233 阅读 · 0 评论 -
leetcode刷题笔记1
C++ 自由存储区是否等价于堆?当我问你C++的内存布局时,你大概会回答:“在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区”。如果我接着问你自由存储区与堆有什么区别,你或许这样回答:“malloc在堆上分配的内存块,使用free释放内存,而new所申请的内存则是在自由存储区上,使用delete来释放。”这样听起来似乎也没错,但如果我接着问:自由存储...原创 2020-04-13 00:25:50 · 202 阅读 · 0 评论 -
友元是否有悖于OOP
代码块1,问题:show()方法没有任何参数。相反,它所使用的对象是由方法调用隐式地提供的。需要一种新的语法——保证函数不会修改调用对象。C++的解决方法是将const关键字放在函数的括号后面。也就是说,show()声明应像这样://代码块1void Stock::show() const{ using std::cout; using std::ios_base; ...原创 2020-04-10 23:18:18 · 192 阅读 · 0 评论