首页 > 编程语言 >初始C++

初始C++

时间:2024-07-06 11:20:15浏览次数:19  
标签:heand 文件 函数 C++ cpp include 初始 log

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

标签:heand,文件,函数,C++,cpp,include,初始,log
From: https://www.cnblogs.com/WZline/p/18287015

相关文章

  • 【C++】认识使用string类
    【C++】STL中的string类C语言中的字符串标准库中的string类string类成员变量string类的常用接口说明成员函数string(constructor构造函数)~string(destructor析构函数)默认赋值运算符重载函数遍历string下标+[]迭代器范围for反向迭代器capacitysizelengthmax_sizeresi......
  • 【C#】初始化三菱运动卡
    添加三菱dll引用WPF实现添加WindowsFormsIntegration引用初始化代码//解决因为第三方控件报错,将实例化的对象添加到控件合集中System.Windows.Controls.GridCTSGrid=newSystem.Windows.Controls.Grid();System.Windows.Forms.Integration.WindowsFormsHostho......
  • C++容器map的常见用法
    文章目录1.map和multimap容器1.map容器的构造和赋值1.构造函数2.赋值操作2.map容器的大小和交换1.获取大小2.交换内容3.map容器的插入和删除1.插入元素2.删除元素3.注意事项4.map容器的查找和统计1.查找元素2.统计元素3.示例5.map容器的排序1.自定义排序规则2.注意点......
  • C++:win11下的VScode构建百度Comate
    一. VScode的安装官网下载地址:https://code.visualstudio.com/ (选择好对应的系统版本)汉化:安装完软件后,打开软件界面的"扩展商店",搜索Chinese,下载相应的插件,如下图:二. 配置C++开发环境VSCode只是一个高级的编辑器,可以用来写C++代码,不能直接编译代码。所以,如果......
  • 【并查集】浅谈思想 & 代码实现 & 实战例题(C/C++)
    思想综述并查集(Union-Find)算法的主要操作包括两种:合并(Union):将两个不相交的集合合并成一个集合。查询(Find):查询两个元素是否属于同一个集合。并查集算法的核心思想是使用树(通常是森林)来表示这些不相交的集合,其中每个集合被表示为一棵树,树的根节点代表这个集合的标识(或称为代表......
  • 引用个数为什么会影响内存泄漏 c++例子
    在C++中,内存泄漏通常与手动管理内存有关,而不是直接由引用计数引起,因为C++标准库本身并不提供自动的引用计数功能。但是,我们可以通过一个例子来间接说明引用(或指针)管理不当如何导致内存泄漏,尤其是当涉及复杂对象结构和所有权关系时,这种管理不当往往体现在循环引用上。基本概念......
  • C++实现计算程序运行的时间
    在C++中,计算程序运行时间可以使用多种方法,其中<chrono>库提供了精确的时间测量功能,适用于C++11及更高版本。以下是一个简单的示例,展示如何使用std::chrono来计算程序运行时间:#include<iostream>#include<chrono>intmain(){  //获取程序开始执行的时间点  au......
  • C++ 基础的输入输出介绍
    C++基础的输入输出介绍在C++编程的世界中,输入输出是连接程序与用户界面的桥梁,是实现人机交互不可或缺的部分。对于初学者而言,掌握C++中基本的输入输出方式——使用cin进行输入和使用cout进行输出,是踏入C++编程大门的第一步。本文将详细介绍如何在C++程序中利用cin和cout来......
  • C++ UTF-8编解码
    icu编解码数据:externconstUConverterSharedData  _MBCSData,_Latin1Data,  _UTF8Data,_UTF16BEData,_UTF16LEData,_UTF32BEData,_UTF32LEData,  _ISO2022Data,   _LMBCSData1,_LMBCSData2,_LMBCSData3,_LMBCSData4,_LMBCSData5,_LMBCSData6......
  • C++——模板详解(下篇)
    一、非类型模板参数模板参数分为类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之后的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。namespaceH{//定义一个模板类型的......