C/C++教程

c++学习笔记(详)

本文主要是介绍c++学习笔记(详),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

0x00 简介

  • 正式转安全研发了,师傅说先把C++基础打好,所以重新刷一遍C++ Primier Plus,这个博客做一下记录。

0x01 编译

g++

  • g++其实是gcc针对c++的一个版本。
    • 链接使用c++的标准库。

常用命令选项

选项 解释
-ansi 只支持ANSI标准的C语法
-c 编译生成目标文件
-E 只运行C预编译器
-g 生成调试信息
-IDIRECTORY 指定额外头文件搜索路径
-LDIRECTORY 指定额外函数库搜索路径
-o 生成指定输出文件
-O0 不进行优化处理
-O (同-O1) 生成优化代码
-O3 最高级优化,包括inline函数
-shared 生成共享目标文件
-static 禁止使用共享链接
-w 不生成任何警告信息
-Wall 生成所有警告信息
-std 选择编译语言的标准

示例

  • 默认:编译文件filename为可执行文件a.out
g++ <filename>
  • 重命名输出:编译文件filename指定输出文件名execname
g++ <filename> -o <execname>
  • 生成目标代码:编译文件filename为目标代码filename.o
g++ -c <filename>
  • 链接目标代码:将目标代码filename.o与其任何库链接起来,并创建一个名为execname的可执行文件。
g++ -o <execname> <filename>.o

创建目标代码后,可以通过将目标代码与其他预编译代码段(其他.o文件)链接来创建可执行文件。

  • 链接扩展类库:使用包含套接字对象代码的库 (sys/socket.h),从名为filename的文件编译名为execname的可执行文件。
g++ -o <execname> <filename> -lxnet

过程

过程

扩展名

平台 扩展名
UNIX C、cc、cxx
GNU C++ C、cc、cxx、cpp、c++
Microsoft Visual C++ cpp、cxx、cc

链接库

参数 链接库
-lxnet 套接字对象库
-lm 数学库
-lpthread 线程库
-lg++ C++库

参考

ANSI标准C

wiki

c99.pdf

  • ANSI C现在被几乎所有广泛使用的编译器支持。现在多数C代码是在ANSI C基础上写的。
  • 如果没有这种预防措施,多数程序只能在一种特定的平台或特定的编译器上编译。

C预编译器

wiki

  • 用于在编译器处理程序之前预扫描源代码,完成头文件的包含, 宏扩展, 条件编译, 行控制(line control)等操作。

共享目标文件

oracle.docs

  • 一种由链接编辑器创建并通过指定 -G 选项生成的输出形式。
  • 共享目标文件是一个不可分割的单元,根据一个或多个可重定位目标文件生成。
  • 共享目标文件可以与动态可执行文件绑定在一起以形成可运行进程。共享目标文件可供多个应用程序共享

编译语言标准

csdn

  • 借助-std选项即可手动控制G++编译程序时所使用的编译标准。
  • 例如-std=c++11表示支持C++11标准,-std=gnu++11表示支持C++11标准和GNU拓展。

目标代码

fsu.edu

  • 目标代码是已编译为机器语言(二进制)但尚未与所有库和其他文件链接的源代码。

0x02 构造

与C的不同

main()

  • main()函数中隐含语句结尾:
return 0;
  • 运行C++程序时,通常从main()函数开始执行。但在Windows编程中,可以编写动态链接库DLL,不需要main()

有些编程环境提供一个框架程序,其中隐藏的main()调用_tmain()

namespace

  • 使用using编译指令简化程序:
using namespace std;

若编译器不接受,说明它不遵守C++98标准。

  • 为了防止多个厂商封装好的函数冲突(同名),使用名称空间进行区分

头文件

  • 新版本C++头文件没有拓展名,部分C头文件去掉.h并在开头加上c变为C++的头文件。
#include<math.h>	//c
#include<cmath>		//cpp
头文件类型 方式 说明
C 旧式 .h结尾 C、C++都可用
C++旧式 .h结尾 仅C++可用
C++新式 无拓展名 仅C++可用,使用namespace
转换后的C 加前缀c,无拓展名 仅C++可用,使用namespace

插入运算符 <<

  • 看上去像左移运算符,在cout中是运算符重载,使得其有不同的作用。

参考

动态链接库DLL

wiki

  • 所谓动态链接,就是把一些经常会共享的代码(静态链接的OBJ程序库)制作成DLL档,当可执行文件调用到DLL档内的函数时,Windows操作系统才会把DLL档加载存储器内,DLL档本身的结构就是可执行档,当程序有需求时函数才进行链接。

using编译指令

microsoft

  • 许多用户不喜欢将引入名称空间之前的代码(使用iostream.hcout)转换为名称空间代码(使用iostreamstd::cout),所以using编译指令简化了这个过程。
// using声明
using std::cout; //使cout有效
using std::cin; //使cin有效
// using编译指令
using namespace std; //使std中所有变量名有效

重载

runoob

  • 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表定义实现)不相同。
这篇关于c++学习笔记(详)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!