# C++回忆:环境建立

本文是原创,如需转发请在转发开头贴上原文地址,谢谢!

# 准备环境

c++建立工程

c++添加类

c++添加类2

这是从创建一个c++工程到新建类的步骤。

# C++的版本

年份 名字
1998 C++98
2003 C++03
2011 C++11,C++0x
2014 C++14,C++1y
2017 C++17,C++1z

# C++编译过程

C++中一个编译单元指一个CPP文件以及include的所有头文件。每个Cpp文件会被编译器编译成目标文件(windows下是*.obj,linux下是*.o),目标文件在windows下拥有PE(Portable Executable,windows可执行文件)文件格式,本身就包含二进制,但是并不能直接执行,因为我们的程序可能会引用库函数或其他程序,链接器将这些目标文件链接成为一个exe或者dll。这个过程中最主要的是编译和链接两个步骤,至于其他的后面再讨论。

# 单独编译

C++鼓励将组件函数放在独立的文件中,可以单独编译这些文件,将它们链接成可执行程序(通常,C++编译器既编译程序,也管理链接器)。如果只修改了一个文件,则可以只重新编译该文件,然后将它与其他文件的编译版本链接。大多数C++环境都提供了其他工具来帮助管理,例如linux上的make程序,可以跟踪程序依赖的文件以及这些文件的最后修改时间。运行make时,如果它检测到上次编译后修改了源文件,make将按之前构建程序所需的步骤编译,修改的源文件重新编译,没有修改的源文件则可以跳过编译直接链接。

将模块的函数体和主程序分别放到单独的文件中,需要将函数的原型也放到这两个文件中,但是如果每个文件都有原型的话要修改原型时需要在每个文件中修改,可以将这些声明放入到一个头文件中,被这其他cpp包含。这样便解决了这个问题。综上,这种模块化的结构分为三个部分:

  1. 包含结构声明和函数原型的头文件。(模块声明部分)
  2. 包含函数体的文件。(模块实现部分)
  3. 调用函数体的文件。(主程序部分)

如果需要编写另一个模块,则需要编写该模块的头文件(模块声明部分),并将该模块的函数体文件(模块实现部分)添加到项目列表或make列表中。这是一种有效的组织程序策略,一个文件包含了用户定义类型的定义,另一个文件包含操纵用户定义类型的函数的代码,这两个文件组成一个软件包。

不要将函数和变量的定义放在头文件中,如果该文件被多次包含,则会出现重复定义的错误,一般头文件包含:

  1. 函数原型。
  2. 使用#define或const定义的符号常量。
  3. 结构声明。
  4. 类声明。
  5. 模板声明。
  6. 内联函数。

声明一般不创建变量,只是告诉编译器一个数据结构,模板声明指示编译器如何生成与源代码中的函数调用相匹配的函数定义,被声明为const的数据和内联函数有特殊的链接属性。

在IDE中,不要将头文件加入到项目列表中,也不要在源代码文件中使用include来包含其他源代码文件。
我们指的单独编译是根据文件,但是c++标准使用了(translation unit)翻译单元,而不是文件,注意文件并不是计算机组织信息时的唯一方式。

# 不同编译器的问题

编译器在执行一些编译工作时会进行一些转换,比如函数的编译,会将函数名转换成一个内部格式,这个格式对于编译器来说更好管理。比如:

long hello(int,float) 转换成 ?hello@@YAXH

这个过程叫名称修饰(name decoration)或者名称矫正(name mangling)。

如何转换名称,修饰时使用的约定随编译器而异。 因此不同的编译器创建的二进制模块很可能无法正确链接,因为两个编译器为同一个函数生成不同的修饰名称,名称的不同将使链接器无法将一个编译器生成的函数调用与另一个编译器生成的函数定义匹配。在链接编译模块时,请确保所有的对象文件或库都是由同一个编译器生成的。如果有源代码,通常可以用自己的编译器重新编译源代码来消除链接错误。

# 预编译头文件

我们注意到vs2015工程中有个文件叫stdafx.h,在vs2017中这个文件改为pch.h(pre compiled header),这个文件叫预编译头文件。如果需要更改这个文件名字,请到项目属性-》配置属性-》C/C++ -》预编译头 处更改。

# 作用

在工程中会有一些头文件可能是所有c++文件都包含的,可以将这些头文件提取出来写在这些预编译头文件中,只编译一遍其他C++文件就都能使用。

# 快捷键

VAssistX的快捷键 名字
shift+alt+s 查找符号
shift+alt+o 找解决方案里的文件
alt+o 在头文件和源文件之间切换
alt+g 跳转到定义或实现的位置
VisualStudio的快捷键 名字
ctrl+j 强迫智能感知
ctrl+k,c 注释选中内容
ctrl+k,u 取消注释选中内容