day02预处理和环境变量

    • 常用的预处理指令
      • 1 复习标准C学过的预处理指令
      • 2 学习常用的预处理指令
      • pragma GCC dependency 文件名
      • pragma GCC poison 标识符
      • pragma pack 整数n
      • 3 常用的预订义宏
    • 环境变量
      • 1 基本概念
      • 2 配置方法
        • 1windows xp 系统中的配置方法
        • 2linuix系统中的配置方法
      • 3 编程相关的常用环境变量
      • 4 查找头文件的主要方式
        • 1include
        • 2include
        • 3配置环境变量CPATHC_INCLUDE_PATH
        • 4通过编译选项来指定头文件
    • 库文件的概念和使用
      • 1 静态库的基本概念和基本特性
        • 1基本概念
        • 2基本特性
      • 2 静态库的生成和调用步骤
        • 1生成步骤vi
        • 2调用步骤

本节内容:
(1)常用的预处理指令
(2)环境变量的概念和使用
(3)库文件的概念和使用



1. 常用的预处理指令

1.1 复习标准C学过的预处理指令

  • #include … 包含头文件
  • #define … 进行宏定义
  • #undef …. 取消宏定义
  • #ifndef … 如果没有定义
  • #ifdef… 如果定义
  • #elif… 否则如果
  • #else 否则
  • #endif… 结束如果
    … …

1.2 学习常用的预处理指令

#line 整数 n(了解)
=>主要用于将下一行的行号设置为第n行;
=>主要用于调试阶段,可以确保整个调试过程中出错的行号保持一致;(02line.c)

#warning 字符串
=>主要用于产生一个警告信息
#error 字符串  
=>主要用于产生一个错误信息(03error.c)   

注意:

#if - 主要用于在预编译阶段你进行条件判断
if - 主要用于在运行阶段进行条件判断
  • pragma GCC dependency 文件名

      主要用于让当前文件依赖于指定的文件名,如果指定的文件最后一次修改时间晚于当前文件,则产生警告信息;(04denpendcy.c)
    如:
    vi show.c文件:
    void show(void)
    {
    printf(“我是帅哥我怕谁?”);
    }

    vi main.c文件:
    #pragma GCC dependency "show.c"
    int main(void) 
    {
        show();
        return 0;
    }
    
  • pragma GCC poison 标识符

    主要用于将后面指定的标识符设置为毒药,一旦使用则产生错误信息;

  • pragma pack (整数n)

    => 主要用于调整结构体的对齐和补齐方式;
    =>结构体的对齐和补齐原则是为了提高存取数据的效率,带来的缺点就是浪费内存空间,是一种典型的牺牲空间
    来换取时间的策略;
    =>调整对齐和补齐方式的本质就是为了节省内存空间,但是会浪费时间;


1.3 常用的预订义宏

__FILE__ 获取当前宏所在的文件名 %s
__LINE__ 获取当前宏所在的行号  %d
__TIME__ 获取当前宏所在文件的最后一次编译时间 %s
__DATE__ 获取当前宏所在文件的最后一次编译日期 %s


2. 环境变量

2.1 基本概念

  环境变量一般指在操作系统中用来指定操作系统运行环境的一些参数,也是用于存放和系统/软件环境相关
信息的特殊变量;
  Path/PATH本质就是一个环境变量,用来存放应用程序的路径信息,当应用程序的信息存放到该环境变量中


2.2 配置方法

(1)windows xp 系统中的配置方法
    我的电脑之 => 右键,选择属性中 => 高级的 => 环境变量 => 系统变量 => 找到Path,点击编辑 => 在Path 

变量值的最后增加分号,再增加新路径 => 一路点击确定即可;
其中分号就是不同路径之间的分隔符;
切记不要修改Path原来的变量值,避免操作无法启动;

(2)linuix系统中的配置方法
打开任意一个终端,执行以下指令:
    export PATH=$PATH:.
    其中$PATH表示将PATH原来的变量获取出来,
    其中:是不同路径之间的分隔符,相当于windows中的分号
    其中.表示当前目录的路径信息
    执行指令之后,表示在环境变量PATH原来变量值的最后增量加冒号,再增加新路径;

上述配置方法只对当前终端有效,为理论使得环境变量的配置的对后续的终端有效,则需要

修改配置文件,流程如下:

vi ~/.bashrc 在文件的末尾增减以下指令:
export PATH=$PATH:.
source ~/.bashrc 使得配置文件立即生效

处理意外情况的方法:

  打开主文件夹,使用ctrl+h显示所有隐藏文件,找到.bashrc文件,使用鼠标右键,选择使用文件编辑器打开,修改对应的指令保存即可;


2.3 编程相关的常用环境变量

  • CPATH/C_INCLUDE_PATH - 主要用于存放C语言头文件的路径
  • CPLUS_INCLUDE_PATH - 主要用于存放C++的路径
  • LIBRARY_PATH - 主要用于存放库文件所在的路径
           - 解决编译连接时找不到库文件的问题
  • LD_LIBRARY_PATH - 主要用于存放共享库所在的路径
             - 解决运行时找不到库文件的问题

2.4 查找头文件的主要方式

(1)#include <>
  • 表示从系统默认的路径中查找该头文件
  • 当前系统中默认的路径是:/usr/include/… …
  • 使用你命令where is stdio.h来查找该文件的位置(路径)
(2)#include “”
  • 表示优先从当前工作目录中查找,如果查找不到,也会去系统默认的路径中进行查找;

注意:

方式(1)(2)的缺点在于:一旦头文件的位置发生改变,则必须修改源程序代码来解决问题

(3)配置环境变量CPATH/C_INCLUDE_PATH
export CPATH=$CPATH:头文件的路径
-export CPATH=$CPATH:..

注意:

方式(3)的缺点在于:当创建多个工程/项目时,配置环境变量的方式可能会引起冲突

(4)通过编译选项来指定头文件
  • gcc/cc xxx.c -I 头文件的路径
  • gcc/cc xxx.c -I ..

注意:

方式(4)既不需要修改源程序代码,也不会引起多个项目之间的冲突,因此推荐使用该方法;



3.库文件的概念和使用

  在大型项目开发中,如果每个函数都放在不同的.o文件中,则项目管理是灾难性的问题,使用库文件可以解决该问题;
  一般来说,为了调用者的使用方便,会将具体的某一个功能模块中的所有.o文件打包成一个/多个库文件,编写者只需要提供库文件和头文件即可;
  库文件主要分为两种:静态库文件(.a)和共享库文件(.so)

3.1 静态库的基本概念和基本特性

(1)基本概念

  静态库本质就是由若干个.o文件打包生成的.a文件中;
  链接静态库的本质就是将静态库中被调用的代码指令复制到调用模块中,体现在最终的可执行文件中;

(2)基本特性
  • 使用静态库的代码在运行时不需要跳转,因此执行效率高;
  • 使用静态库的代码在运行时不需要依赖于静态库文件;
  • 使用静态库生成的可执行文件可能会比较大;
  • 静态库中的代码一旦修改则必须重新链接才能生效;

3.2 静态库的生成和调用步骤

(1)生成步骤vi
  • a.编写源代码文件xxx.c, 如:vi add.c
  • b.只编译步链接生成目标文件xxx.o,如:cc -c add.c
  • c.生成静态库文件
  • ar -r/插入/ lib库名.a 目标文件
    如:ar -r libadd.a add.o
(2)调用步骤
  • a.编写测试源代码文件xxx.c, 如: vi main.c
  • b.只编写不链接生成目标文件xxx.o, 如:cc -c main.c
  • c.链接静态库文件,链接的方式有以下三种:
    • 1)直接链接
      cc main.o libadd.a
    • 2) 使用编译选项进行链接
      cc main.o -l 库名 -L 库文件所在的俄路径
      如:cc main.o -l add -L .
    • 3)配置环境变量LIBRARY_PATH
      export LIBRARY_PATH=$LIBRARY_PATH:.
      cc main.o -l add

练习:

add_static目录中生成的所有文件全部删除,按照笔记的流程重新走一遍

你可能感兴趣的:(UC,标准)