【软件】vs2022自定义模板
前言搞了丐版sdk之后,还可以搞个自己所谓的项目类型。
正文项目模板自然是指可以省去一些基本操作,比如每次新建项目都要新建一个源文件,然后写代码
123456#include<iostream>int main(){ return 0;}
之类的操作。创建一个项目模板的好处是除了文件模板,还对项目有额外引用库什么的选项一并设置好。
这里用项目模板举例就直接套上个sdk项目的了
下一步就完事
至于要不要图标什么的自己选就行,然后输出位置可以默认也可以自己操作,但是不了解的情况下就先用默认的。
完成之后会打开那个文件夹能看到一个lowskd.zip的文件
这里手快了名字敲反了罪过。。
然后新建项目就能看到多了一个选项是自建的
然后顺着这个类型新建项目
发现文件默认就在了。并且库的路径也存在属性中
模板文件1234567#include<iostream>int main(){ return 0;}
每次新建其实都要输入这个。
那么在建模板的时候就看到了其实可以对文件也进行操作。老样子在项 ...
sdk丐版
前言也算不上太牛的
正文封装一些简单的功能。
12345678910111213141516171819//mysdk.cpp#include<iostream>#define SDK_VERSION "1.0"int add(int a, int b){ return a + b;}namespace mysdk{ const char *getVersion(){ //std::cout << SDK_VERSION << std::endl; const char *ver = SDK_VERSION; return ver; }}int main(){ std::cout << mysdk::getVersion();}
说明命名空间没问题。想要别的功能添加到namespace mysdk下面就行,调用的时候也跟std方式相同。
先当已经封装好功能了然后右击右边的文件夹打开属性或者直接在顶栏找项目里的属性,打开之后
...
extern
前言C语言和c++对于函数在编译后的处理不同,所以也要注意源文件不要混用
正文项目里新建俩文件
12345678910111213//main.cpp#include<iostream>using std::cout;using std::endl;int Ave(int a, int b){ return (a + b) / 2;}int main(){ return 0;}
1234//hh.cppint Ave(int a, int b){ return (a + b) / 2;}
编译的时候就发现报错了:
然后新建两个C语言源文件:
123456789#include<stdio.h>int Ave(int a, int b){ return (a + b) / 2;}int main(){ return 0;}
123int Ave(int a, int b){ return (a + b) / 2;}
编译前先注释掉mai ...
translater-定义/声明/文件
前言
声明
定义
#pragma once是一个比较常用的C/C++预处理指令,只要在头文件的最开始加入这条预处理指令,就能够保证头文件只被编译一次。#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过大部分编译器都有这个预处理指令了。#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。#ifdef 和 #define 显然 if 有define这个宏,才会执行里面的内容
正文一般情况下:声明就是告诉编译器存在这么一个东西,就有点像函数;而定义则是申请了内存,就像用到了变量。但是并不是绝对的,概念性的东西还是看人为理解。
函数12345678910111213#include<iostream>using std::cout;using std::endl;int main(){ int x = add(1, 2); return 0; ...
function10-static/inline
引用
static
inline这俩在C语言中也出现过所以不陌生。
前言勿忘模板,二刷常态~~哈哈哈
static 通常用作声明静态变量static type name例如:static int a;static变量如果没有指定初始化,那么会自动初始化为0,且只能初始化一次。而且静态变量即使离开作用域也不会立刻销毁,说明不是存在于栈区的数据。
inline 将函数以内联的方式嵌入到调用的函数。inline int Add(int a,int b){ return a+b; }内联函数会建议编译器把这个函数处理成内敛代码以提升性能,但是否采用看编译器决定。
正文static12345678910111213141516171819#include<iostream>using std::cout;using std::endl;void hhh(){ static int a = 1000; a++; cout << a << endl;}int main(){ hhh(); hhh(); ...
function9-自动推导模板
前言自动推导的用处配合上模板大概才有真正的火花
正文1234567891011int Ave(int a, int b){ return (a + b) / 2;}int Ave(float a, int b){ return (a + b) / 2;}double Ave(int a, float b){ return (a + b) / 2;}
首先瞅一个函数重载,我们简单做个模板:
1234template<typename T>T Ave(T a, T b){ return (a + b) / 2;}
但是这个模板似乎只能适应第一个函数,为什么呢?因为T只代表了一个类型,所以当你函数的参数类型不同时,单纯的参数就搞不明白了。
聪明娃一下子就想到用两个参数了:
1234template<typename T1,typename T2>T1 Ave(T2 a, T1 b){ return (a + b) / 2;}
但是这种虽然是两种参数了,而且返 ...
function8-auto/decltype
引用c++ 11:
auto->decltype
前言auto是一种自动推导的类型,之前学过但是用的比较少。主要也是c++不像java吧,java这种后端项目好像即使大版本更新了,项目也不会主动去换jdk。c++稍微自由一点,听过的感觉都逐步靠近新版本,但肯定不是绝对,毕竟旧项目不考虑升级单纯维护的话也用不到那么新的。
auto好像还是c++11有的,c++14之后对auto又提供了什么也还不知道。
既然可以自动推导,那么可以用来定义变量或者函数
1234567891011auto a = 123; //等价与 int a = 123; auto定义的时候必须有初值,否则无法确定类型,无法确定类型也就无法确定大小。auto ave(int a,int b){ return a + b;}/* 等价于 int ave(int a, int b){ return a + b; }*/
但是这两种使用场景并不是auto最恰当的用法,不管是函数或者变量,其实不推荐auto去推导来声明
正文自动推导 ...
function7-模板
前言重载回顾完之后虽然说让一个函数名有了多个功能,但是每次都要多写一个函数还是挺麻烦的。而模板功能是为了提升复用性的功能。
引用关键字:
template
正文123456int Ave(int a, int b, int c){ return (a + b + c) / 3;}float Ave(float a, float b, float c){ return (a + b + c) / 3;}
假如有这么个函数是求三个数的平均值,抛开类型,算法逻辑是相同的操作。重载也合理。但是如果要对每一个类型都写一个这样的函数,就会变得很麻烦。
12345678template <typename type> type Ave(type a, type b, type c){ return (a + b + c) / 3;}//或者template声明完模板后换行写也可以template <typename type> type Ave(type a, type b, type c){ ...
function6-重载
紫砂了紫砂了函数的东西一堆堆,还涉及到栈,但是只是单纯的知识层面没法结合实际去玩就很恼。。。大概这就是没天赋吧,看后面有没有什么例子补救补救的
正文在C语言里,函数名是不能重复的,变量也是[咱不提全局和局部]。而在c++里,有函数重载的方法,可以让一个函数名有多个功能。
要实现自定义函数完成两个数或者多个数的平均值时:
1234567int Ave(int a, int b){ return (a + b) / 2;}int Ave1(int a, int b, int c){ return (a + b + c) / 3;}
其实变化不大,但是要额外定义。所以c++的函数就多了重载的功能:
123456int Ave(int a, int b){ return (a + b) / 2;}int Ave(int a, int b, int c){ return (a + b + c) / 3;}
函数可以用相同的名称,因为功能大致接近很好的提示了可用性
编译器也会提示有两个重载方法
至于形参的 ...
function5-栈
懒懒散散一天就学一会就是玩游戏刷手机~
前言栈这个东西,百度的也是大概,具体的内存分析还是有待深挖。
在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:
函数的返回地址和参数
临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
正文说人话栈就是为了应对临时变量所产生的一块独立的内存空间,有调用变量和函数时就由计算机自主分配调用,用完就释放。
如果所有变量的内存地址都要固定,程序庞大的时候内存消耗过高
如果变量都是自主分配,麻烦不说,还要自己清理
如果一部分变量系统分配,一部分自主分配,系统分配的系统会自动清理
那么结果肯定是3好。
123456789101112131415161718192021#include<iostream&g ...