开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
Visual Studio
创建项目后,vs会自动生成一些文件.
sln solution 文件 保存项目结构
filters
vcxproj
vs自动生成的文件结构非常混论,建议点击显示所有文件按钮后,添加src文件夹存放源代码。
常用项目配置
输出目录:(SolutionDir)bin\(Platform)$(Configuration)\
中间目录:(SolutionDir)bin\intermediates\(Platform)$(Configuration)\
编译器
一、预编译 preprocessor
1、#define
#define INTEGER int
//编译器在预编译时会将define修饰的内容全部替换,
//此处例子中会将INTEGER替换为int
INTEGER Multiply(INTEGER a,INTEGER b){
}
2、#include
编译器在预编译时会将include的文件内容复制到当前文件中。cpp标准库没有文件后缀,例如iostream ,而c语言标准库又.h后缀,例如stdlib.h。
#include<iostream> //特点include路径用<>
#include "test.h" //相对路径用""
3、#if endif
#if condition
blablabla //只有当condition为真时,此内容才会被编译
#end if
4、#pragma once
只include该文件一次,往往出现在.h文件中,防止头文件被include到同一个cpp中多次。可以代替以前#ifndef #endif的作用,起到头文件保护的作用。
#ifndef _FLAG_H
#define _FLAG_H
blablabla //当该文件被include一次后_FLAG_H就已经被define了,
//如果第二次被include,blabla内容就不会执行
#endif
二、编译为obj (translation unit)
obj file 就是一堆只有cpu认识的二进制数,可以在项目属性中更改输出文件,让编译器输出asm代码,使其具有可读性
链接器 Linking
把多个obj文件,及程序所要用到的库链接在一起
.h 文件放函数declaration
#pragma once
using namespace std;
void countStr(const string str);
.cpp放函数
#include <iostream>
#include <string>
#include "countStr.h"
using namespace std;
int main(char argc, char** argv) {
string str;
cin >> str;
countStr(str);
}
#include <iostream>
#include <string>
using namespace std;
void countStr(const string str) {
for (int i = 0; i < str.length(); i++) {
cout << i << endl;
}
}
头文件 .h
一般用来放函数声明,然后就可以在需要调用的地方#include "***.h"
指针(Pointer)
指针是cpp以及c语言中最重要的概念之一,本质上来说指针是一个存储变量内存地址的整数,指针类型对指针本身并无任何意义,他只是告诉编译器指针指向变量的大小。
#include<iostream>
#define LOG(x) cout<<x<<endl;
using namespace std;
int main(int argc, char** argv) {
char* buffer = new char[8]; //在堆(heap)内创建8字节空姐
memset(buffer, 0, sizeof(buffer));//将buffer置为0
LOG(buffer);
char** buffer_ptr = &buffer;//指向指针buffer的指针
LOG(buffer_ptr);
**buffer_ptr = 10;//改变的是指向buffer指针对应的值,从0变为10
LOG(buffer);
}
#include<iostream>
#define LOG(x) std::cout<<x<<std::endl;
int main(int argc, char** argv) {
char* buffer = new char[8];
memset(buffer, 65, sizeof(buffer));
LOG(buffer); //输出指针指向的8字节内存中的值,因为是char,所以用ascii解析
char** buffer_ptr = &buffer;
LOG(buffer_ptr);
**buffer_ptr = 97;
LOG(*buffer); //只输出指针指向的内存地址的值,因为是char类型,只有1字节,并用ascii解析
}
cpp中的const只修饰其右边的内容
const int* a = new int;
b=2;
*a = 2;//报错,因为const修饰了*a其为常量,即不能更改指针指向地址的值
a = (int*)&b;//不报错,这里我们更改了指针指向的地址
int* const a = new int;
*a = 2;//不报错,因为const修饰了a即指针
a = (int*)&b;//报错
引用(reference)
从汇编代码来看cpp中的引用本质上就是指针,(汇编中的指针和引用代码一模一样),是削弱后的指针。引用必须引用一个已存在的变量,即必须初始化,并且初始化后不可改变。引用本身不是变量,可以把他当成变量的别名。CPP中尽量多使用引用,既节省资源有比指针更加安全。
int& ref = a; //ref必须先初始化,即赋一个变量。