当前位置:   article > 正文

C语言概念笔记——预处理_c语言预处理概念 博客园

c语言预处理概念 博客园

预处理

1.预处理概述:

预处理是源文件编译前所做的预备工作,预处理是要借助预处理程序的,

在源文件编译时,编译器会自动启动预处理程序进行预处理指令的解析,

处理完成后才会进入编译;

2.预处理提供的功能

2.1 宏定义

格式: #define 宏名称 常量数据

带参格式: #define 宏名称(形参)常量数据

预处理:将程序中宏定义后的所有宏名称(不在字符串中)用常量数据进行替换

这个过程也被称为宏展开

宏展开:预处理程序仅作常量数据替换,并不检查语法,检查语法是在预处理后的编译阶段才会被检测;

2.2 文件包含

文件包含:在一个文件中包含另一个文件的全部内容

指令实现:#include

一般格式:#include"文件名"

#include<文件名>

例子:#include<stdio.h>

“ ”和 <>的区别

#include"文件名"   #include<文件名>系统会到系统头文件路径下查找,
Linux系统头文件路径:/usr/include
​
•#include<文件名> #include"文件名"    系统会到当前路径下去查找被包含的文件,如果未找到再去系统头文件路径下查找

指令处理过程:用被包含文件中的内容去替换预处理指令

2.3 条件编译

条件编译含义: 给编译指定一个条件,满足条件的源代码会被编译,不满足条件的源代码会被预处理程序从从整个代码中删除。

条件编译格式:

1.      #if     条件
•       #else
        # endif
2.      #ifdef      符号
•       #else
        # endif

3.      #ifndef     符号
•       #else
        # endif

3.头文件及其编写

头文件作用:1. 用于类型定义(自定义类型,类型重命名(typedef));

2. 函数申明

面试题: 如何避免头文件被重复包含?

思想: 第一次包含时,将被包含的文件内容去替换 #include,此后,如果出现同名头文件时,则让文件的内容有空;

实现: 借助于条件编译 ​ 在头文件最开始:

#ifndef 符号 ​ #define 符号

文件内容

#endif

4.库文件及其生成

4.1 什么是库文件?

库文件本质上是经过编译的可执行代码(库文件是不能单独执行)的二进制形式,可库文件是可以被系统加载到内存中执行

库文件是根据操作系统不同,有不同的格式,换句话说,不同的操作系统下的库文件是不同的,是不兼容的。例如:Linux系统下的库文件,是无法在windows系统下使用的

4.2 库文件的分类

1)静态库 Linux(*.a)

Windows (*.lib)

2)动态库(共享库) Linux(*.so .major . minor)

Windows (*.dll)

4.3 静态库和动态库的区别:

库文件中的代码被加载的实际是不同的:

1) 静态库是在程序编译链接时被复制到最终的可执行程序中,最终可执行程序就含有源文件的代码,和库文件的代码,所以生成的可执行程序往往比较大;

2) 动态库是在程序运行的时候由系统加载到内存中供可执行程序使用的,链接时仅仅是将函数符号加入可执行程序。所以生成的可执行程序往往比较小

4.4 库文件的生成: 说明: Linux 系统中对库文件的命名有一定的规范,遵循以下格式: libxxxx.a / libxxxx.so

xxxx 可被认为是库名称:

linux系统下,库文件往往是存放在 /lib 和 /usr/lib 路径下,系统中链接库文件, ​ 系统也是到该目录下去查找的

  1)  静态库文件的生成:
         1.1  将源文件生成目标文件:   *.c   --->   *.o
            具体实现:  gcc  -c *.c  -o  *.o (-L//指定路径)
​
   1.2  将目标文件归档转换为静态库文件:
             具体实现:借助于归档指令 ar  
         格式:   ar  选项  归档后的文件  要归档的文件
         ar  -rcs   libxxxx.a    *.o  
  
            2)  动态库文件的生成:
          2.1  将源文件生成目标文件(与加载位置无关的代码):   *.c   --->   *.o
                    具体实现:  gcc  -c *.c  -fPIC  -o  *.o
    2.2  生成动态库
            具体实现:  gcc  *.o  -shared  -o  libmyLib.so
​
     或者:  gcc  *.c  -fPIC  -shared -o libmyLib.so
​
  注意: 动态库使用时,程序链接动态库时,仅仅将动态库中的函数符合添加到可执行程序,
         可执行程序运行时,才会加载动态库,所以我们在给用户提供可执行程序时,必须连同
     动态库一起提供。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/609470
推荐阅读
相关标签
  

闽ICP备14008679号