初识C++

  • 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不是一样吗?

posted @ 2024-07-06 11:12  Wzline  阅读(6)  评论(0编辑  收藏  举报