.cxx文件_C++编程自学宝典:你所不知道的软件项目的目录结构和文件结构

本文介绍了C++项目结构,包括编译器的作用、链接器如何处理代码以及源文件类型。文章强调了编译器选项、警告级别和错误处理的重要性,并详细讲解了预处理器的宏定义和常量定义。同时,通过一个简单的示例展示了如何创建和编译源文件,以及如何在命令行中传递参数。
摘要由CSDN通过智能技术生成

1.4 C++项目结构简介

C++项目中可以包含几千个文件,并且管理这些文件甚至可以成为一个单独的工作任务。当构建项目时,如果应该编译某个文件,那么选择哪种工具编译它?文件应该按照什么顺序编译?这些编译器生成的输出结果又是什么?编译后的文件应该如何组织到一起构造可执行文件?

编译器工具还拥有大量的选项,比如调试信息、优化类型、为多种语言特性提供支持以及处理器特性。编译器选项的不同组合将会用于不同场景(比如版本构建和版本调试)。如果用户是在命令行上执行编译任务的,那么务必确保选择了正确的选项,并在编译所有源代码的过程中始终应用它们

文件和编译器选项的管理可以变得很复杂。这也是用户应该使用一款构建工具处理即将上线的产品代码的原因。与Visual Studio一起安装的构建工具有: MSBuild和nmake两款。当用户在Visual Studio环境下构建一个Visual C++项目时,将使用MSBuild ,并且会把编译规则存放在一个XML文件中。用户甚至可以在命令行中调用MSBuild ,将XML项目文件传递给它。 mmake 是Microsoft在多个编译器之间维护程序多个版本的实用性工具。在本章中,读者将学习如何充分利用mmake 的实用性编写一个简单的makefile文件。

在介绍项目管理的基础知识之前,我们必须先了解用户通常会在C++项目中找到哪些文件以及编译器会如何处理这些文件。

1.4.1 编译器

C++是一门高级程序语言,旨在为用户提供丰富的语言特性,以及为用户和其他开发人员提供良好的可读性。计算机的处理器执行底层代码,并且这也是编译器将C++代码转化成处理器的机器码的主要目的。单个编译器也许可以兼容多种处理器,如果代码是符合C++规范的,那么它们还可以被其他编译器编译,以便兼容其他处理器。

不过,编译器的功能远不止于此。如第4章所述, C++允许用户将代码分割成若干函数,这些函数可以接收参数并返回一个值,因此编译器可以配置内存来传递这些数据。此外,函数可以声明只在函数内部使用的变量(第5章将介绍更多细节) ,并且它将只在函数被调用时才存在。编译器配置的内存称为栈帧( stackframe ),编译器中包含如何创建栈帧的选项,比如Microsof的编译器选项 /Gd 、/Gr和/Gz决定了函数参数被推送到堆栈上的次序,以及调用方函数或被调用函数在调用结束时是否应该从堆栈中移除这些参数。当我们编写的代码需要和其他人共享时,这些选项将非常重要(不过基于本书的目的,应该会使用默认的堆栈结构)。这只是冰山一角,不过编译器选项为用户提供的强大功能和灵活性应该会让读者印象深刻。

编译器编译C++代码,如果遇到代码中的错误,将向用户发送编译器错误提示信息。它是对代码的语法检查。这对于确保用户从语法角度编写完美的C++代码非常重要,不过这仍然可能是在做无用功。编译器的语法检查对于检查代码来说非常重要,不过用户应该总是使用其他方法检查代码。比如下列代码声明了一个整数类型变量并为它赋值:

int i=1/0:

编译器将向用户提示C2124 错误: divide or mod by zero (除数不能为0)。不过,下列代码将使用额外的变量执行相同的操作,但是编译器不会报错:

int j =0;inti=1/ j;

当编译器提示出现错误时将停止编译。这意味两件事:首先,你将无法得到编译输出结果,因此将不会在一个可执行文件中找到该错误;其次,如果源代码中存在其他错误,我们只有在修复当前错误重新编译代码时才会发现它。如果你希望对代码执行语法检查并退出编译,可以使用/zs选项开关。

编译器还会生成警告信息。一个警告意味着代码将被编译,但是代码中的某个问题可能会对生成的可执行文件产生潜在的不良影响。Microsof编译器将警告分为4个级别:级别1是最严重的(应该立刻解决),级别4是信息性的。警告通常用于向用户声明被编译的语言特性可以正常运行,不过它需要的某个特定编译器选项,开发者并没有使用

在开发代码期间,我们将会经常忽略警告信息,因为这可能是在测试某些语言特性。

不过,当开发的代码准备上线发布时,你最好对警告信息多加留意。默认情况下, Microsof编译器将显示1级警告信息,你可以使用/选项和一个数字来声明希望看到的警告信息级别(比如, /M2表示用户希望看到2级警告以及1级警告)。在正式上线的产品代码中,你可能会使用/wx选项,这是告知编译器将警告信息也当作错误来看待,我们必须修复所有问题,以便能够顺利编译代码。你还可以使用pragma编译器( pragma 的概念将稍后介绍) ,并且编译器的选项还可以忽略特定警告信息。

1.4.2 链接代码

编译器将生成一个输出。对于C++代码来说,这将是对象代码,不过你可能还会得到一些其他的编译器输出,比如被编译的资源文件。对于它们自身来说,这些文件无法被执行,尤其是操作系统需要设置特定的结构时。一个C++项目将始终包含两个阶段:先将源代码编译成一个或者多个对象文件,然后将这些对象文件链接到一个可执行程序中。这意味着C++编译器将提供另外一种工具,即链接器。

链接器也有决定它如何工作并指定输出和输入的选项供用户选择,并且它还会向我们发出错误和警告信息。与编译嚣类似, Microsof的链接器也有一个选项nx ,它可以将预览版程序中的警告信息当作错误来处理。

1.4.3源文件

在最基本的层面,一个C++项目将只包含一个文件,即C++源代码文件。该文件一般是以cpp或者cxx后缀结尾的。

1.一个简单示例

一个最简单的C++程序如下:

#include //程序的入口点int main(){std;scout 

第一点需要注意的是,以1/开头的行是注释。编译器将忽略直到该行末尾的所有文本。如果你希望使用多行注释,则注释的每行都必须以//开头。你还可以使用C语言风格的注释。一个C语言风格的注释是以1"开头、以./结尾的,这两个标识符之间的内容就是一个注释,包括换行符。

C语言风格的注释是一种对部分代码进行快速说明解释的方式。

大括号1}表示一个代码块。在这种情况下, C++代码就是函数main 。我们可以根据基本的格式判断这是一个函数,首先,它声明了返回值类型,然后具有一对括号的函数名,括号中常用于声明传递给该函数的参数(和它们的类型)。在这个示例中,函数名是main ,括号内是空的,说明该函数没有参数。函数名之前的标识符( int )表示该函数将返回一个整数。

C+中约定名为main 的函数是可执行文件的入口,即在命令行中调用该可执行程序时,该函数将是项目代码中首个被调用的函数。

919ab499767427a7fda4e41ad38b3fca.png

main 函数只包含一行代码:这个单条语句是以std开头,然后以一个分号(;)作为结尾的。C++中空格的使用非常灵活,与之相关的详情将在下一章介绍。不过,有一点读者必须特别留意,那就是在使用文本字符串时(比如本文中使用的) ,每个语句都是用分号分隔的。语句末尾缺少分号是编译器错误的常见来源。一个额外的分号只表示一个空语句,因此对于新手来说,项目代码中分号太少的问题比分号过多更致命。

示例中的单个语句会在控制台上打印输出字符串" He110, world! "(以及一个换行符)。我们知道这是一个字符串,因为它是用双引号标记包裹起来的( ." )。该语句的含义是使用运算符<

对象cout是ostream类的一个实例,并且在main 函数被调用之前已经创建。<

这是一个演示C++灵活性的示例,即被称为运算符重载的特性。运算符<

如前文所述, std:cout 对象已经作为 ostream 类的一个实例被创建,但是没有告知用户这是如何发生的。这将引出我们对这个简单源码文件没有解释的最后一个部分:以#include开头的第一行代码。这里#会高效地向编译器声明某种类型的信息。

可供发送的信息有多种(比如 #define 、#ifdef 、#pragma ,本书后续的内容将会涉及它们)。在这种情况下, #include 告知编译器在此处将特定文件的内容拷贝到该源代码文件中,实际上这意味着上述文件的内容也将被编译。这种特定的文件也叫头文件,并且在文件管理和通过库复用代码方面很重要。

文件 )表示编译器应该到用于存储头文件的标准目录中查找相关内容,不过我们可以通过双引号("" )提供头文件的绝对路径(或者当前文件的相对路径)。C++标准库按照惯例不使用文件的扩展名。你在命名自己的头文件时,最好使用h (或者hpp ,但很少使用hxx )作为文件的扩展名。C运行时库(也可以在C++代码中运行)中对它的头文件也会使用h作为其扩展名。

2.创建源文件

首先在“开始"菜单中找到Visual Studio 2017文件夹,然后单击"Developer Command Prompt for

vS2017"项。这个操作将会启动一个Windows命令提示符并为Visual C++ 2017配置环境变量。不过遗憾的是,它还会将命令行程序停留在Program Files目录下的Visual Studio文件中。如果你希望进行程序开发工作,将会希望将命令行程序从该文件夹移动到其他文件夹中,以便在创建和删除文件时不会对上述目录下的文件造成不良影响。在执行此操作之前,请转到Visual C++目录下,并列出其中文件:

C:Program FilesM
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值