C++语法解析
C++基础语法 | |
---|---|
1 | 每条语句以 ; 结束 |
2 | 大小写敏感,即std::cout STD::cout 互不相同 |
3 | 文字(字符串)放在双引号内 “这是文字” |
4 | 5. /* 注释区域 */ 包裹的内容全部注释 |
5 | 控制台程序是由main函数开始执行的 |
6 | #include 是一条预处理指令 |
7 | 关键字是C++中含有特殊意义的保留字符 如: int |
示例:
#include <iostream>
//预处理指令 导入C++输入输出流头文件
//注释 主要起到说明作用是给程序员看的
int main(){
std::COUT; //错误写法C++中区分大小写
std::cout<<"这是字符串";
int a;float b;
/* int float...等是C/C++中的关键字*/
}
C++基础指令
思考
std::cout<<"/*这是注释*/"; //这是注释
常用基础命令
函数(指令名) | 功能 | 示范 |
---|---|---|
printf | 控制台上显示文字 | printf(“要显示的内容”) |
system | 执行系统命令 | system(“pause”); //暂停 |
特殊字符显示
字符 | 显示结果 |
---|---|
“\\” | \ |
“\”" | ‘’ |
"\’ " | ’ |
“\n” | 换行 |
示例
int main(){
std::cout << "这是一个测试,关于printf!\n \'\'"; //c++
system("pause");
system("cls"); //清屏
printf("这是一个测试,关于printf!\n测试人员姓名:\"Xinux\"");
}
计算机基础知识
计算机主要元器件
处理器(CPU) | 内存(memory) | 硬盘(Hard disk) | 键盘/鼠标 | 显示器 | 主板(mainboard) |
---|---|---|---|---|---|
运算 | 内部存储器 | 外部存储器 | 输入设备 | 输出设备 | 计算机最基本也是最重要的部件之一 |
函数
头文件和源文件
当我们需要分工时,就避免不了多个源文件与头文件的问题
我们添加一个test1.cpp源文件时,可能会有其他的源文件调用test1.cpp中的函数或功能,我们就可以再新建一个test1.h头文件用来放test1.cpp中的函数或功能的 声明 (注意是声明哦) 再将其他源文件想调用test1.cpp中功能的源文件 ,包含我们自己创建的"test1.h"头文件
头文件不会编译
针对多个头文件嵌套问题,声明只有一次,而定义有N次
如果要引用的变量在所有源文件中均有效,就需要在头文件中加入extern关键字,在test1.cpp中声明,或者其他源文件中声明使用都可以。此时使用的是一块内存地址
内联、静态函数只在各自的源文件中有效,静态变量也是。意思也就A的源文件中定义变量为200,那么在B源文件中就需要重新定义,在A源文件中的定义无效,因为从汇编的角度看指向的地址不是同一个地址
其他情况:
假设我们又添加了一个项目,而这个项目又需要我们之前的头文件
- 找到原项目所在头文件的路径
- 复制需要的头文件和源文件
- 找到自己项目的路径拷贝过去
- 在现项目中右键源文件->[添加现有项] 选择需要的文件
- 包含头文件 #include “emath.h” 即可
头文件多次重定义
可以使用一下方式解决
#pragma once //关键字 在多次嵌套头文件时保障只引用一次
//有弊端 在不同的编译器下支持不同
#ifndef _HOPEN_ //定义宏开关
#define _HOPEN_ //如果没有定义该宏则定义宏并执行代码块
...代码段
#endif //ifndef 用endif结尾
extern(C/C++中的代码混用问题)
C/C++代码混用,C和C++的函数调用方式不同,C++支持函数重载,C不支持。
- 1.在头文件中用extern关键字声明
- 2.头文件中用extern关键字声明多个C风格函数
3.在C++源文件中包含头文件时声明
而再当C文件去调用的时候我们又不需要extern关键字了,为解决这个问题,又推出一个新的方法,就是__cplusplus关键字,__cplusplus这个关键字只有C++能识别:
test1.h
#pragma once
#ifdef __cplusplus
extern "C" //当时C++源文件调用头文件时就会读取该关键字,让编译器认识这是一个C风格的函数
#endif
int xxx(); //而C源文件调用该头文件时,它不识别__cplusplus关键字,就会引用这种方式
C语言中不支持函数重载:
#ifdef __cpluscplus
extern "C"
{
#endif
int ave(); //这种写法就可以在头文件写多个函数了,无论是C/C++调用时都可以有效的处理
int sun();
#ifdef __cpluscplus
}
#endif
C和C++源文件混用的问题
C和C++源文件混用的问题以及LNK4042错误
LNK4042对象被多次指定;已忽略多余的指定 externCC++
- 这种情况是因为C和C++文件名重复,修改即可
创建自己的SDK
站在食物链顶端,让众生在我的生态下存货,要学会自己去创造,不要老用别人的
创建功能性源码
先简单的创建两个文件,一个源文件一个头文件,在头文件中写声明,源文件中用命名空间来写其具体功能实现
生成静态lib库
右键[项目 选择 [ 属性 ] 中 [配置属性 > 常规 > 配置类型] 中 选择 lib
应用之后 再次生成 即可
找到lib文件 和 头文件 打包就可以给别人用了
手动使用lib库配置(目前还不会自己写exe文件自动执行)
右键工程 属性 VC++目录 - [包含目录和库目录] 将lib所在路径填到后面,主要 ; 号间
在代码中引入头文件 和 库 就可以使用我们之前的做好的SDK了
直接include <xinux.h>方式
右键属性 -> 链接器 -> 输入 -> [附加依赖项] 加上我们自己的lib文件 就可以通过’#include <xinux.h> 一个操作即可使用我们的SDK
创建自己的项目模板
项目 -> 导出模板 后会自动生成一个zip文件
在目录下会自动生成一个zip文件 那个就是模板了 将该文件放入 对应目录中
函数调用约定
__cdecl
__cdecl调用约定又称为 C 调用约定,是 C/C++ 语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈,此工作由调用者负责,返回值在EAX中。由于由调用者清理栈,所以允许可变参数函数存在,如int sprintf(char* buffer,const char* format,…);。
__stdcall
__stdcall 很多时候被称为 pascal 调用约定。pascal 语言是早期很常见的一种教学用计算机程序设计语言,其语法严谨。参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。
__fastcall
顾名思义,__fastcall 的特点就是快,因为它通过 CPU 寄存器来传递参数。他用 ECX 和 EDX 传送前两个双字(DWORD)或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 EAX 中。
naked
naked 是一个很少见的调用约定,一般不建议使用。编译器不会给这种函数增加初始化和清理代码,更特殊的是,你不能用return返回返回值,只能用插入汇编返回结果,此调用约定必须跟 __declspec 同时使用。例如定义一个求和程序,如__declspec(naked) int add(int a,int b);。
__pascal
这是 pascal 语言的调用约定,跟 __stdcall 一样,参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。VC 中已经废弃了这种调用方式,因此在写 VC 程序时,建议使用 __stdcall 代替。
__thiscall
这是 C++ 语言特有的一种调用方式,用于类成员函数的调用约定。如果参数确定,this 指针存放于 ECX 寄存器,函数自身清理堆栈;如果参数不确定,this指针在所有参数入栈后再入栈,调用者清理栈。__thiscall 不是关键字,程序员不能使用。参数按照从右至左的方式入栈。