首页 > 编程语言 >【C++复习】5.7 多文件结构与编译预处理命令

【C++复习】5.7 多文件结构与编译预处理命令

时间:2023-02-07 12:35:54浏览次数:42  
标签:文件 定义 5.7 C++ 编译 endif 预处理 函数

1、C++项目结构

C++程序的一般组织架构

  1. 类声明文件(.h文件)
  2. 类实现文件(.cpp文件)
  3. 类的使用文件(main()所在的.cpp文件)

用工程组合各文件

2、编译链接

编译链接过程

3、外部变量/外部函数/命名空间

外部变量

  1. 除了在定义它的源文件中可以使用外,还能被其他文件使用
  2. 文件作用域中定义的变量,默认情况下都是外部变量
  3. 在其他文件中如果需要使用,需要用extern关键字声明

外部函数

  1. 在所有类外声明的函数(非成员函数),都是具有文件作用域的
  2. 这样的函数可以在不同的编译单元中被调用
  3. 只要在调用之前进行引用性声明(声明函数原型)即可。

将变量和函数限制在编译单元内

  • 在匿名命名空间中定义的变量和函数,都不会暴露给其他编译单元
  • namespace{//匿名的命名空间
        int n;
        void f(){
            n++;   
        }
    }

     

4、标准C++库

5、编译预处理

  1. #include包含指令
    1. 将一个源文件嵌入到当前源文件中该点处
    2. #include<文件名>
      1. 按标准方式搜索,文件位于C++系系统目录的include子目录下
    3. #include"文件名"
      1. 首先在当前目录中搜索,若没有,再按标准方式搜索
  2. #define宏定义指令
    1. 定义符号常量,很多情况下已被const定义语句取代
    2. 定义带参数宏,已被内联函数取代
  3. #undef
    1. 删除由#define定义的宏,使之不再起作用
  4. #if#endif(条件编译指令)
    1. 一般用在.h文件中,防止头文件被重复包含,防止变量被重复定义
    2. #if 常量表达式
      //当“常量表达式”非零时候编译
      这里是程序正文
      #endif
      //一般用在.h文件中,防止头文件被重复包含
    3. #if 常量表达式
      //当“常量表达式”非零时候编译
      这里是程序正文1
      #else
      //当“常量表达式”为零时候编译
      这里是程序正文2
      #endif
    4. #ifdef 标识符
          程序段1
      #else
          程序段2
      #endif
      /*
      如果“标识符”经#define定义过,且未经#undef删除,
      则编译程序段1,否则编译程序段2
      */
    5. #ifndef 标识符
          程序段1
      #else
          程序段2
      #endif
      /*
      如果“标识符”未被定义过,
      则编译程序段1,否则编译程序段2
      */

 

参考:郑莉C++课程

标签:文件,定义,5.7,C++,编译,endif,预处理,函数
From: https://www.cnblogs.com/FishSmallWorld/p/17097927.html

相关文章

  • C++ 位运算
    位运算基本符号:& 按位与     &=按位与赋值| 按位或       |= 按位或赋值^ 按位异或   ^= 按位异或赋值<< 左移    <<= ......
  • HelloWorld之Java调用C++(JNI)
    JNI(JavaNativeInterface),通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。JNI技术博客:https://blog.csdn.net/m0_37537867/article/details/12413......
  • map c++
    C++map用法总结(整理)1,map简介map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value......
  • C++ 引用:他是坤坤也是鸡哥
    一、前言作为一名ikun,我最喜欢的明星就是坤坤,但是坤坤又不只叫坤坤,因为他的成名之作《鸡你太美》,ikun们就经常亲切的叫他鸡哥。这个过程中,鸡哥就是我们ikun给偶像坤坤......
  • AcWing 791. 高精度加法C++数组实现
    高精度加法a,b均为正整数#include<iostream>usingnamespacestd;constintN=100010;intA[N],B[N],C[N];intAdd(inta[],intb[],intc[],intcnt){......
  • C++11之线程库
    在C++11之前,涉及到多线程问题,都是和平台相关的,比如Windows和Linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,并且可以......
  • 循环链表的创建、插入、删除、逆序、显示(C++实现)
    对于单链表,因为每一个结点仅仅存储了向后的指针。到了尾标志就停止了向后链的操作,这样,其中某一结点就无法找到它的前驱结点了。对于单链表的操作大家能够看我的这篇博客htt......
  • C++实现RVIZ 2D POSE ESTIMATE 功能设置机器人初始坐标
    关于rviz中小车初始点的设置问题一般有两种方法:1打开rviz在其上方工具栏中有2DPoseestimate,用来设置大概的初始点2一般在amcl.launch文件中也会定义初始点,大多设为00......
  • 【八大数据排序法】合并排序法的图形理解和案例实现 | C++
    第十九章合并排序法:::hljs-center目录第十九章合并排序法●前言●认识排序●一、合并排序法是什么?1.简要介绍2.具体情况3.算法分析●二、案例实现1.......
  • Effective C++ Item 11: 在operator=中处理自赋值问题
    定义赋值运算符函数需要注意的问题:返回值类型声明为引用,并在函数返回前返回*this。因为只有返回引用,才能允许连续赋值。传入参数应声明为常量引用,否则从形参到实参会多......