C++ 基本原理

C++基本原理

设计软件简单来说:就是把一个代码文本变成一个可执行程序。

  1. 编写代码文本:我们可以用.txt文件写(推荐使用IDE工具),只要符合编码规范,最后我们将后缀txt格式改为.c(C程序)或.cpp(C++程序)即可。
  2. 生成可执行程序:此时我们要用到IDE工具(集成开发环境),这里我们用Visual Studio(简称VS)
    。主要分为两步,一步为编译(compiling),一步为链接(linking)。我们编写代码时,为了增加代码可读性和扩展性,将不同功能编写在不同的.cpp文件。VS首先对每个cpp文件进行编译(编译生成.obj文件),然后Build项目后通过Linker(链接器)将众多.obj文件串起来,生成一个exe或lib。
编译:预处理代码(pre-process)——标记解释(tokenizing)——解析阶段(parsing)

预处理代码包含:include 、define、if和ifndef、pragma等语句。任何以井号**#**开头的语句都被称为一个预处理命令。

本文主要记录了C/C++预处理指令,常见的预处理指令如下:

#空指令,无任何效果
#include包含一个源代码文件
#define定义宏
#undef取消已定义的宏
#if如果给定条件为真,则编译下面代码
#ifdef如果宏已经定义,则编译下面代码
#ifndef如果宏没有定义,则编译下面代码
#elif如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif结束一个#if……#else条件编译块
#error停止编译并显示错误信息


include语句:告诉预处理,打开哪个文件,读取所有内容,然后复制粘贴到你的文件。
比如在编译A.cpp文件,由于缺少},则编译会报错。

   //A.cpp
   int  text(int a, int b)
   {
   		int c = a * b;
   		return c;

如果增加一个B.h文件,只写一个},并修改A.cpp文件,包含B.h,则编译通过。

   //B.h
   }
   //A.cpp
   int  text(int a, int b)
   {
   		int c = a * b;
   		return c;
   		#include "B.h";

define语句:告诉预处理,搜索这个词,然后替换成后面的东西。
比如用AAAA替换int(不会替换参数内),编译通过。

#define AAAA int
AAAA  text(int a, int b)
{
		AAAA c = a * b;
		return c;
 }

if和endif语句:告诉预处理,让我们一句特定条件包含或者剔除代码。
比如用if 1(true),执行其内代码;if 0(false),屏蔽其内代码。

#if 1
int text(int a, int b)
{
		int c = a * b;
		return c;
 };
 #endif
   #if 0
int text(int a, int b)
   {
   		int c = a * b;
   		return c;
	};
	#endif
链接:主要工作是找到每个符号和函数的位置,并将它们链接在一起

单文件内部链接:单个.cpp文件各函数之间也会链接,
多文件链接:Linker会找到相关函数的定义,然后跟我们main里面调用的函数联系起来(比如在A.cpp声明某个函数,B.cpp文件定义该函数,A.cpp调用B.cpp的该函数)
多文件链接问题:若几个文件同时链接某个函数,则在链接阶段会报错,会出现重复定义的错误(虽然我在文件中只定义了一次)。解决方法:1、在该函数定义前添加static,意味着对该函数链接时,链接只应该发生在该文件内部,对其他.obj文件都不可见。2、、在该函数定义前添加inline,意思是把函数的身体拿过来取代调用

注1:编译运行时,不同阶段(编译或链接)得出不同类型的错误消息,比如只编译时,出现CXXXC开头,代表编译阶段发生的错误;如果build后,出现LNKXXXLNK开头,代表链接阶段发生的错误。

2、变量:c++有各种变量,如int,chat,bool等,单这些数据类型是否没有区别,对计算机来说这些数据类型之间唯一的区别是,当你用该数据类型创建一个变量是,将分配多少内存(计算机只处理数字,比如bool类型,虽然有ture和false,但对计算机来说是1和0)。

//比如小数可用两种类型表示float(4字节)和double(8字节)
 float a=4.5;   //虽然声明了a是folat类型,但实际上a是double类型
 float a=4.5f;  //通过在4.5后增加**f**,则a为float类型

3、函数:它们是我们设计用来执行某项特定的任务的代码块。而在class类中,函数又被称为***方法(methods)***。函数(非方法时)的主要目的是为了防止代码重复多次做一个常见任务,那么为它创建一个函数

4、头文件:主要用于通过include “头文件”,将头文件内的所有内容(比如声明)复制粘贴到文件中假如如果没有头文件,则需要将函数的声明考入每个用到这个函数的文件中。
注:采用VS建立头文件时,会在头文件生成#pragma once,意思是只include这个文件一次,即复制粘贴一次。其也被称为头文件保护符,防止我们把单个头文件多次include到一个单一.cpp文件里。如果多次include一个单一.cpp文件,则会得到一个重复的错误。

#pragma once

void Rrr();

另一种比较老的方法,采用#ifndef XXX,#define XXX、 #endif

#ifndef  _A_H
#define  _A_H

void Rrr();

#endif

推荐采用#pragma once,简洁好用。

如何产生此类错误:A.cpp文件包含B.h和C.h头文件,而C.cpp又包含B.h,如果B.h没有#pragma once,则A.cpp会复制两次B.h中的内容。

include “XXX”和include〈XXX〉的区别:引号用于所有(编译器所在路径和该文件的相对位置),方括号只用于编译器所在的include路径。

#include “..B.h”       //../返回上一级目录,这是相对于本文件的位置。引号也可以改为方括号
#include〈iostream〉   //存在于include目录的里
#include〈stdlib.h〉     //C标准库的头文件一般都有.h扩展名。
#include〈iostream〉   //C++没有

5、调试:调试主要分为打断点和看内存两个部分。
通过VS对程序打断点后,VS界面重新布局。在VS下边栏左侧为变量信息:Autos和Locals基本上只是展示局部变量或对你来说重要的变量。Watch让我们实际监控变量,我们可以在Watch的Name栏输入变量的名字,按下回车键后,添加监控的变量。

另外,我们可以查看整个内存视图***。通过工具栏调试(DEBUG)——>窗口(Windows)——>内存(Mernory)——>内存1(Mernory1)*。如果我们要看变量a的内存,则在新出现的窗口地址(Address)中输入&a,则会出现变量a内存信息。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值