-
1.visual studio2022 创建项目以及创建C++文件
完成上述步骤之后我们就可以敲代码了!! -
2.关于编译和链接
1.ctrl+F7 对当前C++文件进行编译 并会在编译成功后生成.obj文件。
2.F5 运行整个项目 就会将一个项目下的所有 C++文件进行编译 再将编译后生成的.obj文件链接起来生成
一个.exe的可执行程序。
工作的过程是 先进行预处理 之后 转成常量数据或指令 之后生成实际cpu执行的代码
例如:我们在同一个项目中创建两个C++文件 Log.cpp 和Main.cpp
Log.cpp中的代码为
#include <iostream>
void log(const char* message)
{
std::cout << message << std::endl;
std::cin.get();
}
Main.cpp中的代码为
void log(const char* message);
int main()
{
log("Hello Word");
}
在Log文件中已经定义了函数log 在Main中无需重复定义可在申明函数后 调用log函数 在两个文件编译完成后生成.obj文件 之后要进行链接 所以Second中没有定义log函数也能使用 而函数申明告诉编译器 该函数已被定义 可以到其他文件中找到该函数的定义。
- 3.关于include文件包含命令
#include <iostream>
相当于打开 iostream 文件并将其中的内容复制黏贴到当前位置;
例如:先自己创建一个头文件heand.h
只在heand中敲一个 }
同时将 log.cpp 中的 } 删掉替换成 #include"heand.h"(自己的头文件用""引用)
发现同样可以运行
- 4.#define*
预处理命令 宏定义 通常写在代码的开头部分 包含文件命令(#include)之后
例子:#define AA 11;
意思是指在预处理阶段 所有的代码中的AA 都会被替换为 11 - 5.#if和#endif*
保留(#if 1)或排除(#if 0)基于给定条件的代码
例子:
#if 0//排除掉#if 0 和 #endif 间的代码 反之若是 #if 后的条件为真 则保留
void log(const char* message);
int main()
{
log("Hello Word");
}
#endif
可以设置到文件来设置 预处理到文件 来查看 预处理后的代码
设置完成后 Ctrl F7 编译Main文件 在项目目录中会生成 Main.i文件 可查看预处理后的代码
- 6.查看汇编指令(.asm)*
项目属性页设置->c/c++->输出文件->汇编程序输出-仅有程序集的列表/FA - 7.static*
修饰函数可以限制 函数仅在当前文件中使用不会被外部文件链接
应用:
现有
heand.h
#pragma once
#include <iostream>
void log(const char* message)
{
std::cout << message << std::endl;
std::cin.get();
}
Log.cpp
#include <iostream>
void log(const char* message)
{
std::cout << message << std::endl;
std::cin.get();
}
Main.cpp
#include "heand.h" //等同于#include <iostream>
//void log(const char* message)
//{
//std::cout << message << std::endl;
//std::cin.get();
// }
int main()
{
log("Hello Word");//因为heand.h和Log.cpp中都有log函数的定义
//当前位置的函数调用 编译器 不知道链接哪一个
}
所以 在heand.h 或 Log.cpp 文件中任意一个log函数定义前加 static 限制只在自己的文件使用会解决重定义问题
- 8.inline
获取实际含函数体 并将函数调用替换为函数体
例子
heand.h
#pragma once
#include <iostream>
void log(const char* message)
{
std::cout << message << std::endl;
std::cin.get();
}
Log.cpp
#include <iostream>
inline void log(const char* message)
{
std::cout << message << std::endl;
std::cin.get();
}
Main.cpp
#include "heand.h"
int main()
{
std::cout << "Hello Word"<< std::endl;//原log("Hello Word")被替换 是在预处理后被替换;
std::cin.get();
}
- 9.问题
1)把inline这个加在Log.cpp中的log函数前也可以解决重定义问题但是加在heand.h中的log函数前不能解决 不知道为啥??
报错重定义是因为两个函数长得一样 编译器不知道链接哪个
难道是?
先检测文件中要预处理的
在预处理时包含文件命令
先复制黏贴进来
然后 因为发现有 inline 修饰的函数 在Main.cpp中有调用
所以Main.cpp中 log("Hello Word")被替换成函数体 然后进主函数开始逐句运行
因为log("Hello Word")已经被替换成函数体了 所以没有没有调用log()函数 所以编译器就可以不用纠结到底要调用哪一个函数 所以就不会报错重定义了??
但也不对啊 那在heand.h里加inline不是一样吗?