函数模板和类模板 模板的意义:之前调用函数时,是变量参数化,而有了模板后,对类型也可以进行参数化了。template<typename T> // 定义一个模板参数列表 or template<class T>bool compare(T a, T b) // compare是一个函数模板{ return a > b;}int main(){ compare<int>(10, 20); // compare<int>是函数名
const和一级、二级指针以及一级指针和引用的结合 const修饰的是离它最近的类型const int *p : 离const最近的是int,去掉int后,const修饰的就是 *p,代表 *p不能被改变,即p指向的数据不能被改变,p可以被改变重新指向别的内存。int const * p : 离const最近的是 *,但 *不是类型,所以离const最近的还是int,去掉int,修饰的就是 *p,也是代表 *p不能被改变。int *const p : 离const最近的是int *,去掉int *后,const修饰的是p,就是指针本身,代表p只能指向
c++ string和const char*在内存中的地址 int main(){ const char *p = "str"; string s = "str"; int a = 10; cout << "str:" << (&"str") << endl; printf( "p :0x%0x", p); cout << "s :" << (&s) << endl; cout << "a :" <<
linux下使用tcpdump linux系统中,会将DNS服务器地址存放在/etc/resolv.conf文件中。[*************]$ cat /etc/resolv.conf# Generated by NetworkManagernameserver 101.215.217.161.首先打开两个linux终端,在其中一个终端启动tcpdump监听。tcpdump需要在root用户下执行才能生效。[*************]$ sudo tcpdump -i eth3 -nt -s 500 port doma
C++使用内部类实现一种Builder模式(属性内容不对外暴露, 不需管理指针) 假设我们一个生产车的工厂,每辆车有如下属性: 系列、颜色、载人数头文件如下:#ifndef TEST_H#define TEST_H#include <string>#include <memory>using namespace std;class Car{public: class Builder { public: Builder(const Builder &builderArg); Bu
教程:windows下使用vcpkg发布一个静态库(闭源)并使用 以一个很简单的例子,日志记录logtest为例,将以下代码做成静态库用vcpkg发布,并集成使用。vcpkg本身的安装和环境变量设置很简单,使用过程中遇到到的依赖项vcpkg会自动下载,如果遇到下载的慢的项可以手动下载然后按照规定的名称保存在downloads文件夹中即可,这里不再详细讲述。一、准备logtest源码及二进制github头文件.h:#ifndef __LOGTEST__H__#define __LOGTEST__H__#include <string>#includ
c++(windows\linux交叉编译)编译sqlite源码 下载源码一.linux平台(1)x86_64进入sqlite-autoconf-3350500目录执行./configure CC=gcc AR=gcc-armake clean && make即可在lib文件中得到libsqlite3.a和libsqlite3.so(2)i686理论上只需要在./configure中执行CFLAGS=-m32即可,但是这样会报错,提示需设置host,最简单方法是x86_64编译完成后,直接打开生成的Makefile文件,找到CFLAG
c++(跨平台)实现高自由自定义变长参数日志输出(使用cout,非printf,无需格式化),打印变量名及变量值 运用了多项c++新语法(c++11\14\17)折叠表达式、正则表达式分割字符串、变长参数模板等。打印格式为:“文件名、行数、描述、变量名:变量值”,使用简单,仅需传递变量名即可。话不多说,直接上代码,解释见注释。...
使用基于C++11的线程池实现生产者-消费者模型(demo) 模型:一个输入触发的生产者线程,不断的生产数据,一个消费者背景线程,不断的取出数据,只有当取出数据处理成功后才将数据删除。线程池使用参考:https://www.cnblogs.com/lzpong/p/6397997.html代码很简单,源码如下:#pragma once#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <vector>#include <queue>#include <thread>
c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库)) 参考https://blog.csdn.net/mincheat/article/details/77987740一般情况,模板函数被外部其他引用会提示找不到函数,原因是:编译本身这个cpp的时候,没有发现有引用的地方,那么就不会被编译,而编译引用这个模板函数的其他cpp的时候,要直接调用这个函数,就会发现这个函数没有编译,没有实现,所以报错,找不到该函数。因此心生一计,是否可以写一个额外函数在本cpp中将该模板函数使用一下,外部就可以找到此函数了。适用场景:希望对外声明提供的头文件简单并隐藏实现。
linux下使用atosl解析dylib 1.源码git clone https://github.com/facebookarchive/atosl2.直接make会编译不过,需要下载依赖文件:(1)libdwarf的头文件和.so(2)libiberty的头文件和.a(3)libswift的文件和.a3.根据编译错误修改makefile,编译成功后4.需传入是解析的dylib文件,和cpu_subtype,如果这个subtype传错的话,会导致无法解析。ex:./atosl -o xxx.dylib -arch arm64 0
linux下使用googlebreakpad解析dmp文件获取堆栈 1.下载google-breakpad源码git clone https://chromium.googlesource.com/breakpad/breakpad2../configure3.make4.进入src/processor目录,拷贝想要解析的dmp文件到该目录5.此处由于环境是ubuntu,执行script -f output.txt(将屏显输出到文件)再执行./minidump_stackwalk xxx.dump (符号表目录,可选)结果便存储到output.txt中了
golang reflect demo讲解 Demo这里引用了第三方包go get github.com/influxdata/tomlgo install github.com/influxdata/toml就可以直接使用第三方代码了,可以修改,也可以打断点。package mainimport ( "fmt" "reflect" "github.com/influxdata/toml")type testInterface interface {}type testStruT struct { TestF
windows/linux/mac通过c++执行终端命令(或脚本)获取输出到字符串 void getOutbyCmd(const string &cmdStr, string &outStr){ FILE *fileStream = NULL; #ifdef WIN32 if ((fileStream = _popen(cmdStr.c_str(), "r")) == NULL) #else if ((fileStream = ::popen(cmdStr.c_str(), "r")) == NULL) #endif
gcc部分编译、链接选项解释 1.生成与位置无关的代码编译选项:-fPIC/-fpic:编译共享库使用-fPIE/-fpie:编译可执行程序时使用链接选项:-pie:需与以上编译选项配合使用2.静态库、动态库-shared:指定生成动态链接库。-static:指定生成静态链接库。...
windows下多目录makefile demo讲解(VSCODE) 1.前提首先可以下载TDM-GCC或者Mingw-w64,然后找到make.exe的位置,可以将如下名字复制一份改成make.exe方便使用,记得加入环境变量。2.代码目录:每个文件均实现打印,方便证实最后生成出来的exe是运行结果。#include "bb.h"#include <iostream>using namespace std;void bb::funcbb(){ cout << "funcbb" << endl;}3.ma
golang chan demo讲解 无缓冲func testChan() { ch := make(chan int) // 不带第二个参数代表无缓冲,即如果放入了一个数据ch <- task 若没有取出数据的线程task := <-ch,线程将会挂起等待直到数据被取出 //启动固定数量的worker for i := 0; i < 5; i++ { go worker(ch) // go代表起一个协程并行运行,此处循环多少个,代表起了多少个协程执行任务 } //发送任务给worker t
golang flag包 demo讲解 func testFlag() { arg1 := flag.String("p1", "arg1 default value", "arg1 description help") arg2 := flag.String("p2", "arg2 default value", "arg2 description help") arg3 := flag.Bool("p3", true, "arg3 description help") flag.Parse() var cmd string =