BIT-0程序环境和预编译 c语言预处理
1.程序的翻译环境
2.程序的执行环境
3.c语言程序的编译+链接
4.预定义符号介绍
5.预处理指令#define
6.宏和函数的对比
7.预处理操作符#和##的介绍
8.命令定义
9.预处理指令#include
10.预处理指令#undef
11.条件编译
程序的翻译环境和执行环境
在ANSI C的任何一种实现中,存在两个不同的环境,第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令,第二种是执行环境它用于实际执行代码
详解编译+链接
翻译环境
程序的编译过程
1.组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)
2.每个目标文件由连接器(linker)捆绑在一起,形成一个单一而完整的可执行程序
3.连接器同时也会引入标准c函数库中任何被该程序所用到的函数,而且它还可以搜索程序员个人的程序库,将其需要的函数也链接到程序中
通俗讲上面这段话就是 首先翻译环境分为两个阶段,一个叫编译 ,一个叫链接,编译会依赖编译器 编译完了会生成目标文件 目标文件再经过连接器进行链接最终处理生成可执行程序
编译又可以分为几个阶段
第一个阶段 预编译
做的事情是
1. #include头文件的包含,把头文件的内容全部都包含放到.c文件里面去
2.删除注释,使用空格来替换注释
3.将#define定义的符号 全部换成所对应的值
总归一句话预处理做的事情叫做文本操作
test.c文件经过编译器处理会生成一个test.i的文件
第二个阶段 编译
做的事情是
编译是把test.i翻译成test.s把c语言代码翻译成了汇编代码
1.语法分析,看语法有没有错误
2.词法分析
3.语义分析
4.符号汇总 比如全局变量 函数 main g_val
其实就是把c语言代码转换为汇编代码
第三个阶段 汇编
将汇编代码转换生成test.o文件 test.o在windows下是test.obj文件也就是目标文件
做的事情是
1.把汇编代码转换成二进制的代码,也称二进制指令 指令就是代码
2.上一个阶段不是进行符号汇总了,在汇编阶段形成符号表
符号表就是各自的文件中的符号 比如函数名 和全局变量 和它们的地址的组成
那么如何形成符号表
全局变量和函数名
#include<stdio.h>
extern int Add(int x,int y)
int main()
{return 0;
}
编译阶段不是已经产生符号汇总了
所以汇编阶段就会形成符号表
这里面会产生符号是全局变量ADD和main函数
符号汇总会形成
ADD 0x112233
main 0x223344
将符号和它的地址对应起来就会形成符号表
汇编完了之后生成test.0文件 然后通过连接器生成可执行文件
1.预处理选项 gcc-E test.c -0 test.i 预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中
2.编译 选项 gcc-S test.c 编译完成之后就停下来,结果保存在test.s中
3.汇编 gcc-c test.c汇编完成之后就停下来,结果保存在test.o中 .o文件在windows下就是.obj文件
连接发生的事情
1.合并段表
首先目标文件也就是.obj文件它会有自己的格式 会自己分成几个段
将多个目标文件连接在一起 对应段的数据合并在一起,这就是合并段表最终生成一个可执行程序
2.符号表的合并和符号表的重定位
将各自目标文件的符号表合并成为一个符号表
//符号表合并如果符号名相同肯定会用地址有效的符号表
整个翻译环境所做的事情完成 生成可执行程序
运行环境
程序执行的过程
1.程序必须载入内存中,在有操作系统的环境中:一般这个由操作系统完成,在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成
2.程序的执行便开始,接着便调用main函数
3.开始执行程序代码,这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值
4.终止程序,正常终止main函数,也有可能是意外终止
预编译阶段也叫预处理阶段
预处理详解
预定义符号
- FILE 文件名符号
- LINE 行号
- DATE 获取日期
- TIME 获取时间
- STDC 果编译器遵循ANSI C 其值为1 否则未定义
这些预定义符号都是语言内置的
int main()
{printf("%s\n", __FILE__);//文件名符号 d:\桌面\c\date11_2\test11_2\test11_2\today.cprintf("%d\n", __LINE__);//行号 101查看 你在多少行printf("%s\n", __DATE__);//获取日期 Nov 2 2021printf("%s\n", __TIME__);//获取时间 17:39:36printf("%s\n", __STDC__);//如果编译器遵循ANSI C 其值为1 否则未定义//写日志文件int i = 0;int arr[10] = { 0 };FILE* pf = fopen("log.txt", "w");for (i = 0; i < 10; i++){arr[i] = i;fprintf(pf, "file:%s line:%d data:%s time:%s i=%d\n", __FILE__,__LINE__,__DATE__,__TIME__,i);}fclose(pf);pf = NULL;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}
预处理指令都有哪些
#define
#include
#if
#end
#end if
#pragma pack(4)
#pragma
#ifdef
#line
以#开头的都叫预处理指令
#define 预处理指令
#define 定义标识符
语法 #define name stuff
实例
#define MAX 1000#define reg register //为register这个关键字,创建一个简短的名字#define do_forever for(;;)//用更形象的符号来替换一种实现#define CASE break;case//再写case语句的时候自动把break写上//如果定义的stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续航符)#define DEBUG_PRINT print("file:%s\t line:%d\t \date:%s\t time:%s\n", \__FILE__,__LINE__, \__DATE__,__TIME__)
结论 #define max 1000 后面不要加; 因为容易导致语法错误
define 定义宏
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)
下面是宏的申明方式:
#define name(parament-list)stuff 其中的parament-list是一个由逗号隔开的符号表他们可能出现在stuff中
注意:参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在参数列表就会被解释为stuff的一部分
#define SQUARE(X) ((X)*(X)) //SQUARE就是宏
#define SQUARE(X) ((X)*(X))
这里将5给x 然后后面的替换掉x就是5x5了
牢牢记住这里不是把5传给x而是把5跟x进行了替换,也就是写宏的时候永远
不要忘记括号int main()
{int ret = SQUARE(5);printf("%d\n", ret);//25return 0;
}
#define DOUBLE(X) (X)+(X)
int main()
{int a = 5;int ret = 10 * DOUBLE(a);printf("%d\n", ret);//55/*因为这里a替换掉了x,所以回来就是10*a+a所以就是55了*/return 0;
}
总结定义宏的时候 #define DOUBLE(X) ((X)+(X))一定不要忘记多写括号
提示: 所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用
#define替换规则
1.调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,它们首先被替换
2.替换文本随后被插入到程序中原来文本的位置对于宏,参数名被它们的值替换
3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号,如果是就重复上述过程
注意:
1:宏参数和#define定义中可以出现其他#define定义的变量,但是对于宏,不能出现递归
2:当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索
#define MAX 100
#define DOUBLE(x) ((x)+(x))
int main()
{int a = 5;int ret = 10 * DOUBLE(MAX);//也就是说这里首先将MAX进行替换,然后在对宏进行替换printf("MAX =%d\n", MAX);//也就是说这里的字符串里面的""里面的MAX是不能被替换的它是字符串本身的内容return 0;
}
#和##
如何把参数插入到字符串中
int main()
{printf("hello world\n"); //hello worldprintf("hello " " world\n");//hello worldprintf("hel" "lo " " world\n");//hello worldreturn 0;
}
#的作用
#define PRINT(X) printf("the value of " #X " is %d\n", X)#X的作用就是把参数插入到字符串中
#X也就是找到X所对应的字符并把#X换成 "所对应的字符" 比如"a" "b"int main()
{int a = 10;int b = 20;多个字符串放在一起天然的会连接在一起 PRINT(a);被替换成 printf("the value of " "a" "is %d\n", a)它的结果就是: the value of a is 10PRINT(b);被替换成 printf("the value of " "b" "is %d\n", b);/它的结果就是: the value of b is 20return 0;
}
##的作用
##可以把位于它两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符
#define CAT( X , Y) X##Y
//这里就会变成Class##84 ##就把它两边的符号连到一起
int main()
{int Class84 = 2019;printf("%d\n", CAT(Class ,84 )); //2019return 0;
}
带副作用的宏参数
当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能
出致不可预测的后果,副作用就是表达式求值的时候出现的永久性效果,例如
x + 1; 不带副作用
x++; 带有副作用
MAX宏可以证明具有副作用的参数所引起的问题
int main()
{int a = 10;int b = a + 1; //这里的a赋给b的时候自己本身没有改变int c = ++a; //这里的a先自身改变,然后在赋值给creturn 0;
}
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
int main()
{int a = 10;int b = 20;int max = MAX(a++, b++);
/*首先因为宏的参数完全是替换那么就会变成
int max = MAX((a++)>(b++)?(a++):(b++))
a++先使用后自增 所以a是10
b++先使用后自增 所以b是20
10不大于20所以执行后面b++
b此时是21 先使用传给MAX,然后在自增变成22所以 MAX此时是21 b就会变成22 a是11
*/printf("%d\n", max);//21printf("%d\n", a); //11printf("%d\n", b); //22return 0;
}
宏和函数求解两个数的较大值
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
int Max(int x, int y)
{return (x > y ? x : y);
}
int main()
{int a = 10;int b = 20;float c = 3.0f; float d = 4.0f;//函数在调用的时候 会有函数调用和返回的开销//int max1 = MAX(a, b);//printf("max1 = %d\n", max1);//int max2 = Max(a, b);//printf("max2 = %d\n", max2);//int max1 = MAX(c, d);//printf("max1 = %d\n", max1);//从“float”转换到“int”,可能丢失数据float max2 = MAX(c, d);printf("max2 = %f\n", max2);//预处理阶段就完成了替换//没有函数的调用和返回的开销return 0;
}
宏和函数进行对比
宏通常被应用于执行简单的运算,比如在两个数中找出较大的一个
#define MAX((a,b)(a)>(b)>(a):(b))
那为什么不用函数来完成这个任务,原因有二
1.用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多,所以宏比函数在程序
的规模和速度方面更胜一筹
2.更为重要的是函数的参数必须声明为特定的类型,所以函数只能在类型合适的表达式上使用,反之这个宏
咱可以适用与长整型,整型,浮点型,等可以用来>来比较的类型,宏是类型无关的
当然和宏相比函数也有劣势的地方
1.每次使用宏的时候,一份宏定义的代码将插入到程序中,除非宏比较短,否则可能大幅度增加程序的长度
2.宏是没法调试的
3.宏由于类型无关,也就不够严谨
4.宏可能会带来运算符优先级的问题,导致程序容易出现错误
宏有时候可以做函数做不到的事情,比如:宏的参数可以出现类型但是函数做不到
#define SIZEOF(type) sizeof(type)
int main()
{int ret = SIZEOF(int);//这里就会被替换成 int ret = sizeof(int)printf("ret = %d\n", ret);//4return 0;
}
用宏来实现malloc
#define MALLOC(num, type) (type*)malloc(num* sizeof(type))
int main()
{int* p = (int*)malloc(10 * sizeof(int));//这样就开辟了10个整型的空间//那么如何用宏来实现呢看下面int* p = MALLOC(10,int);//这样就用上面宏来实现了//这代码就会被替换成 int* p = (int*)malloc(10* sizeof(int));return 0;
}
宏和函数的对比
属性 | #define定义宏 | 函数 |
---|---|---|
代码长度 | 每次使用时,宏代码都会被插入到程序中除了非常小的宏之外,程序的长度会大幅度增长 | 函数代码只出现于一个地方每次使用这个函数时都调用那个地方的同一份代码 |
执行速度 | 更快 | 存在函数的调用和返回的额外开销,所以相对慢一些 |
操作符优先 | 宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否则临近操作符的优先级可能会产生不可预料的后果,所以建议宏在书写的时候多谢括号 | 函数参数只在函数调用的时候求值一次,它的结果值传递给函数表达式的求值结果更容易预测 |
带有副作用的参数 | 参数可能被替换到宏体中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果 | 函数参数只在传参的时候求值一次,结果更容易控制 |
参数类型 | 宏的参数与类型无关,只要对参数的操作是合法的,它就可以使用于任何参数类型 | 函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数,即使它们执行的任务是不同的 |
调试 | 宏是不方便调试的 | 函数可以逐语句调试 |
递归 | 宏是不能递归的 | 函数是可以递归的 |
函数和宏的命名约定
一般来讲函数和宏的使用语法很相似,所以语言本身没法帮我们区分二者,那我们平时的一个习惯是把宏名全部大写,函数名不要全部大写
#undef
这条指令用于移除一个宏定义
#define MAX 1000
int main()
{printf("MAX = %d\n", MAX);
#undef MAXprintf("MAX = %d\n", MAX);//这里的MAX已经用不了了,因为已经被移除了
如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除return 0;
}
命令行定义
许多c的编译器提供了一种能力,允许在命令行中定义符号用于启动编译过程,例如:当我们根据同一个源文件要
编译出不同的一个程序的不同版本的时候,这个特性有点用处,(假定某个程序中声明了一个某个长度的数组,如果
机器内存有限,我们需要一个很小的数组但是另外一个机器内存大写,我们需要一个数组能够大写)
int main()
{int array[ARRAY_SIZE];//这里的值现在没有给定明确大小,但是在编译的时候可以给定明确大小int i = 0;for (i = 0; i < ARRAY_SIZE; i++){array[i] = i;}for (i = 0; i < ARRAY_SIZE; i++){printf("%d ", array[i]);}return 0;
}
编译指令 gcc -D ARRAY_SIZE = 10 program.c 在这里可以给ARRAY_SIZE进行赋值
条件编译
在编写一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的,因为我们有条件编译指令
比如说:调试性的代码,删除可惜,保留又碍事,所以我们可以选择性的编译
常见的条件编译指令
(1)
#if 常量表达式
//…
#end if
//常量表达式由预处理器求值。
(2)多个分支的条件编译
#if 常量表达式
//…
#elif 常量表达式
//…
#else
//…
#endif
(3).判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
(4).嵌套指令
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(0S_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif
#ifdef #endif
#define DEBUG //这里是对DEBUG进行定义
int main()
{int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };int i = 0;for (i = 0; i < 10; i++){arr[i] = 0;
#ifdef DEBUG //如果DEBUG定义 那么就执行下面的代码,如果DEBUG没定义,那么久不执行下面代码 printf("%d ", arr[i]);
#endif}return 0;
}
指令实例
(1)
int main()
{int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };int i = 0;for (i = 0; i < 10; i++){arr[i] = 0;
#if 1 //这里如果if后面的常量表达式如果为真就执行下面的代码,如果为假就不执行printf("%d ", arr[i]);
#endif }return 0;
}
(2)
int main()
{
#if 1==2 //如果这条语句为真,执行haha如果为假到下一步printf("haha\n");
#elif 2==2 printf("hehe\n");//如果上面语句为假,这条语句为真,那么执行hehe否则到下一步
#elseprintf("嘿嘿\n");//如果上面两步代码都为假,那么执行嘿嘿
#endifreturn 0;
}
(3)
#define DEBUG 0 //这里就是对DEBUG进行定义
int main()
{
#if defined(DEBUG) //只要DEBUG定义过就执行hehe这条语句,如果没定义过,就不执行这条语句printf("hehe\n");
#endif
#ifdef DEBUG //这个跟上面的方法一摸一样printf("hehe\n");
#endifreturn 0;
}
int main()
{
#if !defined(DEBUG) //这里和上面相反,如果没有定义DEBUG反而要执行下面语句,如果定义了就不执行printf("hehe\n");
#endif
#ifndef #endif
#ifndef DEBUG
这里的ifndef里面多了一个n就表示 没有定义DEBUG就执行下面语句,
定义了就不执行printf("hehe\n");
#endifreturn 0;
}
文件包含
我们已经知道,#include指令可以使另外一个文件被编译,就像它实际出现于#include指令的地方一样
这种替换的方式很简单:预处理先删除这条指令,并用包含文件的内容替换,这样一个源文件被包含10次
那就实际被编译10次
头文件被包含的方式
#include"filename"
查找策略:先在源文件所在目录下查找如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置
查找头文件,如果找不到就提示编译错误,
linux环境的标准头文件的路径。 /usr/include
windows按照自己安装路径进行查找
库函数包含
如果直接引的是库函数文件那么直接用<>就可以了
#include<filename.h>
查找头文件直接去标准路径下去查找,如果找不到就提示编译错误
包含就是把它所对应的文件拷贝一份过来
如何解决一段代码被重复包含 答案 : 条件编译
第一种方法
每个头文件的开头写
#ifndef TEST__H
#define TEST__H
//头文件的内容
#endif
第二种方法
#pragma once
防止下面这段代码被重复多次包含
#ifndef TEST__H
#define TEST__H
int ADD(int x, int y);
#endif
#pragma once
int ADD(int x, int y);
问题1:头文件中ifndef/define/endif是干什么用的
答案:防止头文件被重复多次包含
问题2:#include<filename.h>和#include"filename.h"有什么区别
答案:应用场景不一样,查找策略不一样
预处理阶段
1.条件编译指令
2.#include
3.#define
#包含的
…
#pragma pnce
#pragma pack()
#line
offsetof
请编写宏,计算结构体中某变量相对于首地址的偏移,并给出说明
offsetof的用法
#include<stddef.h>
struct S
{char c1;int a;char c2;
};
int main()
{printf("%d\n", offsetof(struct S, c1));//0printf("%d\n", offsetof(struct S, a)); //4printf("%d\n", offsetof(struct S, c2));//8//offsetof是计算结构体变量相对于首地址的偏移量return 0;
}
模拟实现offsetof
struct S
{char c1;int a;char c2;
};
#define MYOFFSETOF(struct_name,member_name) (int)&(((struct_name*)0)->member_name)
int main()
{printf("%d\n", MYOFFSETOF(struct S, c1));printf("%d\n", MYOFFSETOF(struct S, a));printf("%d\n", MYOFFSETOF(struct S, c2));return 0;
}
面试题1
有如下宏定义和结构定义
#define MAX_SIZE A+B
struct _Record_Struct
{unsigned char Env_ALARM_ID : 4;unsigned char Paral : 2;unsigned char state;unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct * pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct)* MAX_SIZE);
当A=2,B=3时pointer分配(9)个字节的空间
面试题2
#include<stdio.h>
int main()
{unsigned char puc[4];struct tagPIM{unsigned char ucPim1;unsigned char ucData0 : 1;unsigned char ucData1 : 2;unsigned char ucData2 : 3;}*pstPimData;pstPimData = (struct tagPIM*)puc;memset(puc, 0, 4);pstPimData->ucPim1 = 2;pstPimData->ucData0 = 3;pstPimData->ucData1 = 4;pstPimData->ucData2 = 5;printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]); //02 09 00 00return 0;
}
面试题3 计算联合体大小
union Un
{short s[7];int n;
};
int main()
{printf("%d\n", sizeof(union Un)); //16return 0;
}
面试题4
在X86环境下,有下列程序
下面代码结果是多少
int main()
{union{short k;char i[2];}*s, a;s = &a;s->i[0] = 0x39;s->i[1] = 0x38;printf("%x\n", a.k);//0x3839return 0;
}
面试题5
enum
{X1, //0Y1, //1Z1=255,A1, //256B1 //257
};
enum enumA = Y1; //1
enum enumB = B1; //257
printf("%d %d\n", enumA, enumB); //1 257
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- class学习(四)
1.this指针指向被调用函数所属对象 所以在类的非静态成员函数中返回对象本身,可以return *this。 2.this指针的本质是指针常量。即指针指向不可以修改 也可在成员函数后面加const,让指针指向的值也不可以修改本质为:const Person * const this void sho…...
2024/4/24 21:48:20 - PHP获取星期六星期日
PHP获取星期六星期日 public function week($str) //判断规定时间 是否是 周六 周日{$str "2021-11-06 00:00:00";if((date(w,strtotime($str))6)){echo 你输入的日期是周 6666;}else if ((date(w,strtotime($str)) 0)){echo 你输入的日期是周 7777;}else{echo 不是…...
2024/4/20 12:59:35 - 达梦数据库DEM服务器配置
DEM 由以下几个部分组成: DEM 服务器 DEM 存储数据库 要管理和监控的数据库实例 数据库代理服务(dmagent) 其中 DEM 服务器为 DEM 应用服务器,负责处理客户端工具功能逻辑并存储 dmagent收集到的数据到 DEM 存储数据库,同时展…...
2024/4/17 23:37:28 - 共享办公室出租,创业者们的空间
深圳的办公室成本在全国来说都是比较高的,深圳的创业者也比较多,有很多创业者在开始创业的时候资金并不宽裕,租普通的写字楼需要的费用比较大,这种情况下选择在深圳租共享办公室出租,可以做前期过渡使用,等…...
2024/4/24 9:55:43 - 011-Spring MVC全局异常处理
使用 ExceptionHandler 处理异常 ExceptionHandler 是作用在方法上的注解,在对应的Controller中定义 ExceptionHandler 注解的方法即可处理当前 Controller 对应的异常。 package com.yyoo.springmvc.controller;import com.yyoo.springmvc.bean.MyResponse; impo…...
2024/4/24 16:45:27 - CentOS搭建Nfs存储服务器,自用收藏
一、服务端 1.安装rpcbind和nfs-utils yum -y install rpcbind nfs-utils2.编辑配置文件 vi /etc/exports3.输入下列配置 /nfstest 192.168.1.10/24(rw,sync)参数详解: /nfstest : 是服务端本地的共享目录 192.168.1.10/24 :是客户端的IP地…...
2024/4/18 7:47:50 - javascript使用笔记
1、通过JavaScript使用ajax访问链接出现跨域名访问怎么办? 答:运行本地的html来获取服务器的信息时出现这种问题,将html代码放到服务器上就没有问题了,其他情况尚且不做考虑,遇到了再说。...
2024/4/20 5:50:47 - OWASP-文件上传漏洞简述(低中高)
OWASP-文件上传漏洞简述:OWASP-文件上传漏洞(低级):OWASP-文件上传漏洞(中级):OWASP-文件上传漏洞(高级):webshell文件包含:注:仅作学习使用 OWA…...
2024/4/21 0:21:45 - DDD领域驱动设计:CQRS架构模式
文章目录前言一、 CQRS介绍1.什么是 CQRS2.为何要使用CQRS二、CQRS 架构1.单数据库 CQRS2.双数据库 CQRS3.事件源 (Event source) CQRS结尾前言 DDD 作为一种系统分析的方法论,最大的问题是如何在项目中实践。而在实践过程中必然会面临许多的问题,「模式…...
2024/4/15 3:33:09 - 搭建vue框架+vscode环境
一、安装node.js 官网: Node.js 安装完后cmd查看版本: 二、安装阿里巴巴镜像: npm install -g cnpm --registryhttp://registry.npm.taobao.org 三、安装vue: 安装vue文件:cnpm install i vue -S 安装脚手架&…...
2024/4/15 3:33:19 - Android 使用AgentWeb库轻量级H5混合开发
一个轻量级的库,加载html效果很好,而且功能很强大。那就是AgentWeb GitHub地址:https://github.com/Justson/AgentWeb GitHub上面介绍: AgentWeb 是一个基于的 Android WebView ,极度容易使用以及功能强大的库&…...
2024/4/19 6:41:05 - 大疆嵌入式工程师面经(base:深圳)
目录补:目前状态一、帖子说明二、个人背景三、面试前期准备1. 简历2. 自我介绍3. 项目介绍4. 企业及工程师文化(二面及终面会有涉及,工程师文化要重点关注,可以写在自我介绍里,建议看一下近三年大疆的宣讲会࿰…...
2024/4/24 7:49:44 - c++实现Myvector。
c实现一个自己的vector。我们用到c的类、重载、模板类。 #pragma once #include<iostream> #include<cstring> #include<cassert> template<typename T> class MyVector { public:MyVector(int size 10);~MyVector();//访问T& at(int index) con…...
2024/4/25 1:44:38 - 线性判别准则和线性分类算法【人工智能】
目录 一、线性判别分析LDA原理 LDA的原理及推导过程 LDA算法流程 LDA算法优缺点 二、线性分类算法(支持向量机SVM) 优缺点 优点: 缺点: 三、LDA算法代码实现 python编程实现: sklearn 库实现 四、月亮数据集算…...
2024/4/15 9:09:43 - 微服务简单介绍
一、概念 微服务:一个单体应用分成多个小的功能单位。 1、优点: (1)单体架构的代码过于集中臃肿,微服务化之后代码复杂性减少,逻辑结构更加清晰(结构本身的优点) (2&…...
2024/4/18 21:42:00 - 04 纯函数-柯里化实现-组合函数
纯函数 纯函数的理解 一:确定的输入一定会产生确定的输出 二:函数在执行过程中不能产生副作用 副作用的理解 就是在函数内部修改了外部变量,修改了参数,改变外部的储存 副作用一般是bug的温床 案例 纯函数优势 柯里化 定义…...
2024/4/20 14:51:17 - Gitlab RCE CVE-2021-22205
Gitlab RCE CVE-2021-22205声明代码声明 本程序仅供于学习交流,请使用者遵守《中华人民共和国网络安全法》,勿将此脚本用于非授权的测试,脚本开发者不负任何连带法律责任。 代码 {"Name": "Gitlab RCE CVE-2021-22205"…...
2024/4/15 3:33:50 - 重新启程之Vue2:基础
目录 1.使用脚手架与不使用脚手架创建的区别 2.创建Vue实例,进行挂载 3.认识Vue指令 4.了解生命周期(钩子函数) 5.了解组件 全局组件格式: 局部组件格式: 怎么用template(模板)标签 写组…...
2024/4/18 7:55:14 - 批量把彩色图和深度图转换为彩色点云文件(C++)
1、单个彩色图和深度图转换为彩色点云文件(C): 全部代码如下: // C 标准库 #include <iostream> #include <string> using namespace std;// OpenCV 库 #include <opencv2/core/core.hpp> #include <openc…...
2024/4/24 14:04:26 - eclipse2020安装
eclipse2020安装0.码仙励志1.安装Jdk2.下载3.安装0.码仙励志 山顶对我们半山腰的人来说并不遥远。 1.安装Jdk 安装前需要先安装jdk1.8(或更高版本),没有安装jdk的请看我博客里安装jdk的文章,或者点下面的链接。 Windows系统jd…...
2024/4/19 9:32:09
最新文章
- 算法学习笔记Day9——动态规划初探
一、介绍 本文解决几个问题:动态规划是什么?解决动态规划问题有什么技巧?如何学习动态规划? 1. 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多ÿ…...
2024/4/25 5:23:43 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 整理的微信小程序日历(单选/多选/筛选)
一、日历横向多选,支持单日、双日、三日、工作日等选择 效果图 wxml文件 <view class"calendar"><view class"section"><view class"title flex-box"><button bindtap"past">上一页</button&…...
2024/4/21 18:25:43 - InternLM2-lesson2笔记
书生浦语大模型趣味 Demo 视频连接:https://www.bilibili.com/video/BV1AH4y1H78d/?vd_source902e3124d4683c41b103f1d1322401fa 目录 书生浦语大模型趣味 Demo课程总览SIG项目Demo部署的一般流程存在的问题总结 课程总览 InternLM2-chat-1.8B部署八戒-chat-1.8B…...
2024/4/24 15:13:57 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/23 20:58:27 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/23 13:30:22 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/23 13:28:06 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/24 18:16:28 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/23 13:27:44 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/19 11:57:53 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/23 13:29:53 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/23 13:27:22 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/23 13:28:42 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/23 22:01:21 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/23 13:29:23 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/25 0:00:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/25 4:19:21 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/19 11:59:23 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/19 11:59:44 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/25 2:10:52 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/24 16:38:05 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/23 13:28:14 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/23 13:27:51 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/23 13:27:19 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57