初始C++

news/2024/10/5 9:12:56/文章来源:https://www.cnblogs.com/WZline/p/18287015
  • 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不是一样吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739223.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql 8.4 安装(Centos7.9)

前置准备root 环境下执行# 关闭selinux vi /etc/selinux/config # SELINUX=enforcing =>SELINUX=disabled # 开通防火墙3306/tcp firewall-cmd --permanent --add-port=3306/tcp下载链接获取https://dev.mysql.com/downloads/file/?id=529414下载&安装 下载 mkdir -p …

工具|--LINQPad|--使用DnSpy调试LINQPad

前言LINQPad本身就有调试功能, 使用dnSpy调试LINQPad的代码, 岂不是多此一举 ? 其实主要是为了使用dnSpy调试LINQPad中使用到依赖dll的的底层代码, 比如, 在LINQPad中使用到了WPF的dll, 使用dnSpy就可以调试到WPF的一些底层代码.并且, 我尝试过, 直接使用dnSpy加载LINQPad生成…

字符串函数库的经典使用学习

<?php// 1.单引号定义字符串// 2.双引号定义字符串// 3.定界符定义字符串// 1.单引号定义字符串// echo this is my mother;echo this is \my\ mother <br>;// 单引号不能解析转义符\n 换行 \t 缩进echo this \n is a simple \t string<br>;$username = admin;…

解密Prompt系列33. LLM之图表理解任务-多模态篇

这一章我们聚焦多模态图表数据。先讨论下单纯使用prompt的情况下,图片和文字模态哪种表格模型理解的效果更好更好,再说下和表格相关的图表理解任务的微调方案上一章我们介绍了纯文本模态的表格理解任务,这一章我们聚焦多模态图表数据。先讨论下单纯使用prompt的情况下,图片…

用StabilityMatrix一键安装Stable Diffusion

Stable Diffusion是2022年发布的深度学习文字到图像生成模型,它既能免费使用,又能部署在本地端,又有非常多的模型可以直接套用,在使用体验上比Midjourney和DALL-E更加强大。Stable Diffusion使用的模型有下列几大类,对照模型网站 https://civitai.com 以形成更直观的认识:…

「代码随想录算法训练营」第四天 | 链表 part2

24.两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/ 题目难度:中等 文章讲解:https://programmercarl.com/0024.两两交换链表中的节点.html#算法公开课 视频讲解: https://www.bilibili.com/video/BV1YT411g7br 题目状态:有思路,但细节…

【0基础学爬虫】爬虫框架之 feapder 的使用

前言 大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫。 学习爬虫的过程中,一…

PTA题目集7-8的总结

PTA题目集7-8的总结 1.前言: 2.设计与分析: 3.踩坑心得: 4.改进意见: 5.总结 1.前言:PTA题目集7新增了互斥开关,窗帘,多并联电路和多串联电路。由于之前的输入信息中设备的引脚没有作用,所以我的正则表达式只用来提取设备的名字。而互斥开关有三个引脚,不同引脚的电压…

pycharm 动态绘图

_tkinter.TclError: Cant find a usable init.tcl in the following directories:解决办法: 1 打开报错地址所在文件 D:/Program Files/METACOMP/mlib/tcltk8/lib/tcl8.4/init.tcl: version conflict for package "Tcl": have 8.6.9, need exactly 8.4 2 修改init.t…

从零开始教你写一个MLIR Pass

笔者在去年写了一篇LLVM Pass的教程,现在从事MLIR的开发近1年了,写点教程回馈下社区。 MLIR(Multi-Level Intermediate Representation,多层中间表示)是LLVM之父(博士期间开发的LLVM)的Chris Lattner带领团队开发的编译器基础设施,其增强了 LLVM IR表达能力,而且其是关注P…

idm下载

获得百度网盘直链下载链接调用idm谷歌插件获得城盘直链下载链接调用idm谷歌插件 https://ctfile.qinlili.bid/当你的才华配不上你的野心,努力的时候到了!

Arthas进阶-笔记

《Arthas进阶》 学习目标类和类加载器相关的命令 monitor/watch/trace/stack等核心命令的使用 火焰图的生成 Arthas实战案例dump 作用 将已加载类的字节码文件保存到特定目录:logs/arthas/classdump/ 参数数名称 参数说明class-pattern 类名表达式匹配[c:] 类所属 ClassLoader…