• 3-C++程序的结构1.5


    多文件结构和编译预处理命令

    1、c++程序的一般组织结构

    通常一个项目至少划分为三个文件:类定义文件(*.h文件)、类实现文件(*.cpp文件)和类的使用文件(*.cpp,主函数文件)。如下:

    这三个单独的源文件构成,他们的相互关系和编译、连接过程,如下

    2、外部变量和外部函数

    a、为了使变量除了在定义它的文件中使用外,还要被其他文件使用,可以将其声明为外部变量,用extern关键字。

    外部变量时具有文件作用域的变量,定义在所有文件之外。声明一个外部变量时,可以同时定义它,也可以只是引用一个在别处声明的外部变量。

    定义一个文件作用域的变量时,其默认状态是可以为不同的编译单元(即源文件)所共享的,只要在其他编译单元在中冠以extern声明该变量即可。

    b、外部函数

    在所有类之外声明的函数(非成员函数),都是具有文件作用域的,如果没有特殊说明,这样的函数都可以在不同的编译单元中被调用,只要在调用之前函数原型即可。

    3、标准c++库和命名空间

    在c语言中系统函数和一些宏定义都放置在运行库中,c++的库中除了继续保留了c语言系统函数外,还加入了预定义的模板和类。标准c++类库是一个极为灵活并可扩展的可重用软件模板的集合。标准c++类与组件在逻辑上分为6中类型:

    输入/输出类

    容器类与ADT(抽象数据类型)

    存储管理类

    算法

    错误处理

    运行环境支持

    对于库中预定义内容的说明分别存在于不同的头文件中,要使用这些预定义的成分,就要将相应的头文件包含到圆程序中。不同的编译系统,库和头文件都会略有不同。

    4、编译预处理

    编译器在对源程序进行编译之前,首先要由预处理程序对程序文本进行预处理。预处理程序提供了一组编译预处理指令和预处理操作符。

    a、#include指令

    也称为文件包含指令,其作用是将另一个源文件嵌入到当前源文件中该点处。有两种格式:#include<文件名>和#include"文件名"

    b、#define 和#undef指令

    在c语言中,还可以使用#define来定义带参数宏,以简单实现函数的计算,而在c++中这一功能已被内联函数取代。

    #undef的作用是删除#define定义的宏,使之不再起作用。

    c、条件编译

    形式1

    #if 常量表达式  //当常量表达式为非零时,编译本程序段

         程序段

    #endif

    形式2

    #if 常量表达式

      程序段1

      #else

      程序段2

    #endif

    形式3

    #if 常量表达式1

         程序段1

    #elif 常量表达式2

         程序段2

       ....

    #elif 常量表达式n

      程序段n

    #else

         程序段n+1

    #endif

    形式4

    #ifdef   标识符

               程序段1

    #else

        程序段2

    #endif

    如果标识符经#define定义过,且未经undef删除,则编译程序段1,否则,编译程序段2

    形式5

    #ifndef   标识符

               程序段1

    #else

        程序段2

    #endif

    与形式4相反

    4、defined操作符

    它是一个预处理操作符,而不是指令,因此不要加#开头,defined操作符使用的形式为:defined(标识符)

    若标识符在此前经#define定义过,未经删除,则上述表达式为非0.否则上述表达式的值为0.

    由于文件包含指令可以嵌套使用,在设计程序是要避免多次重复包含同一个头文件,否则会引起变量及类的重复定义。

    一般会在头文件中加上

    //head.h

    #ifndef HEAD_H

       #define HEAD_H

    .......

    首先判断HEAD_H是否定义过,没有则是第一次编译,如果定义过就说明已经参加过编译了。

  • 相关阅读:
    浅谈移动通信和无线通信
    jdk8处理时间
    Mysql查询报错:Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
    linux系统执行mysql脚本:Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    org.springframework.boot.web.server.WebServerException: Unable to create tempDir. java.io.tmpdir is set to C:UsersADMINI~1AppDataLocalTemp2
    java实现每个单词首字母大写
    常用Java技术社区
    Hibernate处理事务并发问题
    Hibernate的检索策略
    Java对象在Hibernate持久化层的状态
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6214980.html
Copyright © 2020-2023  润新知