大话C++语言:编译器(大话c语言这本书怎么样)
sinye56 2024-10-22 16:16 13 浏览 0 评论
1 C++常见编译器介绍
C++语言的编译器是将C++源代码转换为机器可执行代码的工具。以下是一些广泛使用的C++编译器:
- GNU Compiler Collection (GCC):GCC是一个自由软件编译器集合,支持C、C++、Objective-C、Fortran、Ada和Go等多种编程语言。它是最流行的开源C++编译器之一,广泛用于各种操作系统和平台上。
- Clang:Clang是基于LLVM的C、C++、Objective-C和Objective-C++编译器前端。它以其出色的错误消息、性能以及丰富的源代码静态分析工具而闻名。
- Microsoft Visual C++ (MSVC):MSVC是微软开发的C++编译器,与Visual Studio集成。它为Windows平台提供了强大的开发工具,包括集成开发环境、调试器和性能分析工具。
- Intel C++ Compiler (ICC):由Intel开发的C++编译器,提供了自动向量化和并行化等高级优化特性,特别适用于需要高性能计算的应用。
- Borland C++:Borland系列编译器(包括早期的Turbo C++)曾经非常流行,尤其是在DOS和Windows 3.1时代。Borland C++ Builder Compiler是其中的一个产品,它包括了对ANSI/ISO C++语言的支持。
- Watcom C++:Watcom C++是一个历史悠久的编译器,以其在DOS时代的高效编译而著称。现在,Watcom C++作为Open Watcom开源包发行,支持多种操作系统。
- Digital Mars C++ Compiler:Digital Mars是一款高性能的C和C++编译器,它包括了一个集成开发环境和多种编程工具,如反汇编器和资源编译器。
- Tiny C Compiler (TCC):TCC是一个小型的C语言编译器,虽然它主要用于C语言,但也支持一些C++特性。
- Code::Blocks:Code::Blocks是一个轻量级的C++集成开发环境,它支持多种编译器,包括GCC和Clang,并且提供了代码自动补全、调试和版本控制等功能。
- Qt Creator:基于Qt框架的C++集成开发环境,它提供了一套完整的工具集,用于开发跨平台的应用程序。
这些编译器各有特点,其中,GCC和Clang因其开源和跨平台特性在许多Linux发行版中被广泛采用;而MSVC则在Windows平台上提供了优秀的集成开发体验。
扩展知识:
g++ 和 gcc 是GNU编译器集合(GNU Compiler Collection,简称GCC)中的两个相关但独立的编译器,它们都用于从源代码生成可执行程序,不过它们分别针对不同的编程语言。
- gcc:
- gcc 是GNU C Compiler的缩写,它是GCC中用于编译C语言程序的编译器。
- 它支持多种与C语言相关的语言标准,如ANSI C(ISO C89)、ISO C99、ISO C11等。
- gcc 也可以用于编译C++程序,但需要链接C++标准库。在某些系统中,可能存在一个名为c++的符号链接到g++,这样你就可以使用c++命令来编译C++程序。
- g++:
- g++ 是GNU C++ Compiler的缩写,它是GCC中用于编译C++程序的编译器。
- 它不仅包含了gcc的功能,还增加了对C++特定特性的支持,如类、模板、异常处理等。
- g++ 默认链接C++标准库(如libstdc++),而gcc 默认链接C标准库。
因此,它们之间的具有以下关系:
- 相同之处:
- 它们都是GCC编译器集合的一部分。
- 它们共享底层的优化器和代码生成器,因此对于底层的C代码,两者在优化和生成的机器代码方面可能是相同的。
- 不同之处:
- gcc 主要用于编译C语言程序,而g++ 用于编译C++程序。
- g++ 在编译C++程序时会启用C++语言特性,并链接C++标准库,而gcc 需要额外指定链接C++标准库的选项(如-lstdc++)。
- g++ 支持C++特有的编译选项和编译阶段,如模板元编程、名称修饰(name mangling)和RTTI(运行时类型识别)。
2 g++编译器简介
2.1 g++编译器安装
g++ 是GNU编译器集合中用于编译C++程序的编译器。如果Linux操作系统没有安装g++的话,以Ubuntu为例,参考以下命令安装g++
whccf@whccf-VirtualBox:~$ g++
Command 'g++' not found, but can be installed with:
sudo apt install g++
whccf@whccf-VirtualBox:~$ sudo apt install g++
[sudo] whccf 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
gir1.2-goa-1.0 gir1.2-snapd-1
使用'sudo apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
g++-7 libstdc++-7-dev
建议安装:
g++-multilib g++-7-multilib gcc-7-doc libstdc++6-7-dbg libstdc++-7-doc
下列【新】软件包将被安装:
g++ g++-7 libstdc++-7-dev
升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 11.2 MB 的归档。
解压缩后会消耗 42.4 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-updates/main amd64 libstdc++-7-dev amd64 7.5.0-3ubuntu1~18.04 [1,471 kB]
获取:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-updates/main amd64 g++-7 amd64 7.5.0-3ubuntu1~18.04 [9,697 kB]
获取:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-updates/main amd64 g++ amd64 4:7.4.0-1ubuntu2.3 [1,568 B]
已下载 11.2 MB,耗时 2秒 (5,127 kB/s)
正在选中未选择的软件包 libstdc++-7-dev:amd64。
(正在读取数据库 ... 系统当前共安装有 176694 个文件和目录。)
正准备解包 .../libstdc++-7-dev_7.5.0-3ubuntu1~18.04_amd64.deb ...
正在解包 libstdc++-7-dev:amd64 (7.5.0-3ubuntu1~18.04) ...
正在选中未选择的软件包 g++-7。
正准备解包 .../g++-7_7.5.0-3ubuntu1~18.04_amd64.deb ...
正在解包 g++-7 (7.5.0-3ubuntu1~18.04) ...
正在选中未选择的软件包 g++。
正准备解包 .../g++_4%3a7.4.0-1ubuntu2.3_amd64.deb ...
正在解包 g++ (4:7.4.0-1ubuntu2.3) ...
正在设置 libstdc++-7-dev:amd64 (7.5.0-3ubuntu1~18.04) ...
正在设置 g++-7 (7.5.0-3ubuntu1~18.04) ...
正在设置 g++ (4:7.4.0-1ubuntu2.3) ...
update-alternatives: 使用 /usr/bin/g++ 来在自动模式中提供 /usr/bin/c++ (c++)
正在处理用于 man-db (2.8.3-2ubuntu0.1) 的触发器 ...
whccf@whccf-VirtualBox:~$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
2.2 g++常用命令
g++ 常用命令如下表所示:
功能/选项 | 描述 | 示例 |
基本编译 | ||
-c | 只编译不链接,生成目标文件(.o) | g++ -c source.cpp |
-o | 指定输出文件名 | g++ source.cpp -o output |
多文件编译 | ||
多个源文件 | 同时编译多个源文件 | g++ source1.cpp source2.cpp -o output |
头文件和库 | ||
-I | 指定头文件搜索路径 | g++ -I /path/to/headers source.cpp -o output |
-L | 指定库文件搜索路径 | g++ -L /path/to/libs source.cpp -o output |
-l | 链接指定库(无需指定文件扩展名) | g++ -lmylibrary source.cpp -o output |
调试和优化 | ||
-g | 添加调试信息 | g++ -g source.cpp -o output |
-O | 优化等级(0-3),默认不优化 | g++ -O2 source.cpp -o output |
-Og | 优化并保留调试信息 | g++ -Og source.cpp -o output |
警告和错误 | ||
-Wall | 显示所有标准警告 | g++ -Wall source.cpp -o output |
-Wextra | 显示额外的警告 | g++ -Wextra source.cpp -o output |
-Werror | 将警告视为错误 | g++ -Werror source.cpp -o output |
标准和方言 | ||
-std | 指定 C++ 标准(如 C++11, C++14, C++17, C++20) | g++ -std=c++17 source.cpp -o output |
-pedantic | 严格按照标准进行检查 | g++ -pedantic source.cpp -o output |
链接器选项 | ||
-static | 使用静态库链接 | g++ -static -lmylibrary source.cpp -o output |
-shared | 生成共享库 | g++ -shared -o libmylibrary.so source.cpp |
其他 | ||
-v | 显示详细的编译过程 | g++ -v source.cpp -o output |
-E | 仅进行预处理,不编译或链接 | g++ -E source.cpp -o output.i |
-S | 生成汇编代码 | g++ -S source.cpp -o output.s |
2.3 g++告警选项
g++ 常用告警选项如下表所示:
告警选项 | 描述 |
-Wall | 启用一组常用的告警选项,包括一些常见的编程错误。 |
-Wextra | 提供比 -Wall 更严格的告警集,包括一些额外的潜在问题。 |
-Wpedantic | 启用所有符合C++标准的告警,要求代码严格遵循C++标准。 |
-Wconversion | 告警所有可能的类型转换问题。 |
-Wsign-compare | 当使用有符号和无符号整数进行比较时发出告警。 |
-Wshadow | 如果局部变量遮蔽了外部变量,发出告警。 |
-Wunused | 告警所有未使用的变量、函数和参数。 |
-Wunused-result | 如果函数返回结果没有被使用,发出告警。 |
-Winit-self | 当变量被初始化为自己的值时,发出告警。 |
-Wmissing-include-dirs | 如果包含了不存在的目录,发出告警。 |
-Wimplicit-fallthrough | 在switch语句中,如果没有明确标记break或continue,发出告警。 |
-Wformat | 检查printf和scanf等格式化字符串函数的参数类型和格式字符串是否匹配。 |
-Wself-move | 当对象被移动到自身时,发出告警。 |
-Wdouble-promotion | 当浮点数被隐式提升为双精度时,发出告警。 |
3 C++第一份代码"hello,world"
- VS Code编写"hello, world",源代码文件名helloworld.cpp
#include <iostream>
int main()
{
// 输出 "Hello, World!"
std::cout << "Hello, World!" << std::endl;
return 0;
}
- Linux环境下,使用g++编译并生成helloworld的可执行程序
g++ -o helloworld helloworld.cpp
- Linux环境下,执行helloworld可执行程序
./helloworld
4 代码分析
- 预处理指令#include <iostream>
- #include 是一个预处理指令,它告诉编译器在编译之前要包含指定的头文件。
- <iostream> 是一个标准库头文件,它包含了C++标准库中关于输入/输出流的对象和函数的声明。 <iostream> 提供的 std::cout 对象,它代表标准输出流,用于向控制台输出数据。
- 主函数int main()
- main 函数是C++程序的入口点,即程序从这里开始执行。
- int 是 main 函数的返回类型,表示 main 函数将返回一个整数。
- 在操作系统中,这个返回值通常用于指示程序是否成功执行。通常,返回 0 表示程序成功执行,而非零值表示出现错误。
- 输出语句 std::cout << "Hello, World!" << std::endl;
- std::cout 是一个输出流对象,用于向标准输出(通常是控制台或终端)发送数据。
- << 是一个插入运算符,用于将数据发送到输出流。
- "Hello, World!" 是一个字符串字面量,表示要输出的文本内容。
- std::endl 是一个流操纵符,它向输出流插入一个换行符,并刷新输出缓冲区,确保数据立即被显示在控制台上。
- 返回值 return 0;
- return 语句用于从函数中返回一个值。
- 在 main 函数中,return 0; 表示程序成功执行,并返回状态码 0。
---E N D---
喜欢的记得关注哦!
您的支持是我们前进的动力!
相关推荐
- 程序员:JDK的安装与配置(完整版)_jdk的安装方法
-
对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...
- Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置
-
一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...
- 麒麟系统安装JAVA JDK教程_麒麟系统配置jdk
-
检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...
- 学习笔记-Linux JDK - 安装&配置
-
前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...
- Linux新手入门系列:Linux下jdk安装配置
-
本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...
- 测试员必备:Linux下安装JDK 1.8你必须知道的那些事
-
1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...
- Linux 下安装JDK17_linux 安装jdk1.8 yum
-
一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...
- 在Ubuntu系统中安装JDK 17并配置环境变量教程
-
在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...
- 如何在 Linux 上安装 Java_linux安装java的步骤
-
在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...
- Windows和Linux环境下的JDK安装教程
-
JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...
- linux安装jdk_linux安装jdk软连接
-
JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...
- linux安装jdk,全局配置,不同用户不同jdk
-
jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...
- 运维大神教你在linux下安装jdk8_linux安装jdk1.7
-
1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...
- window和linux安装JDK1.8_linux 安装jdk1.8.tar
-
Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...
- 最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?
-
默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)