进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)

简介: 进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)

2.4#undef

知识点:

作用是对#define定义的常量进行移除

基本形式:#undef + 所要移除常量的名称

image.png

2.5命令行定义

C语言提供了可以通过终端的方式对符号进行定义(如:gcc -D a = 100 test.c)

一般用于:一个变量先暂时不被定义,就能方便根据后面的具体情况来定

2.6条件编译

知识点:

可以对语句进行选择性的编译/放弃编译(因为有些代码删除了还有点可惜,就留着不编译)

在预处理阶段处理:

1.判断是否为真

#if 常量表达式(为真进去,反之不进)

      ....

#endif (和#if配套)

#if 常量表达式(其用法和if语句几乎一样,)

       //...

#elif 常量表达式

       //....

#else

       //...

#endif (结束)

2.判断是否被定义

#if define(symbol)

#ifdef symbol  (上下等价)

#if !define(symbol)

#ifndef symbol

细节:

如:

#define PRINT 0
int main()
{
#ifdef PRINT //是否定义该符号,定义了则进去,否则不进去
//#if define(PRINT) 
    printf("%d\n", 1);
#endif//和ifdef是一组的,必须成对出现
    return 0;
}
//
#define M 2
int main()
{
#if 1
  printf("%d\n", 1);//打印1
#endif
#if M == 1
  printf("%d\n", 1);
#elif M == 2
  printf("%d\n", 2);//打印2
#else
  printf("ohuo");
#endif
  return 0;
}

2.7文件包含

2.7.1文件包含的方式

本地文件包含("  "双引号包含):先在源文件所在的目录下查找,若没找到就在到存放库函数的标准路径下查找。若还找不到则提示编译错误(一般自己创建的头文件是直接放在源目录底下的所以就通过双引号包含即可,并且通过了解了双引号包含就能知道其实库函数的包含也可以用" "包含即#include"stdio.h")

库文件的包含(< >的包含):虽然" "可以实现但是对于库函数来说还是有点麻烦了所以C语言提供了直接到标准路径中去查找头文件(即#include<stdio.h>)

2.7.2文件的嵌套包含

对于头文件的包含来说每一次的包含其实都是将头文件的内容拷贝过来,假如不小心多次包含了同一个头文件的话,就会导致内存的浪费(已经包括过了)

为了防止上述情况我们就可以在头文件中写成如下形式:

#ifndef __def__//判断是否被定义过
#define __def__//若没有定义过则进来定义一遍,反之则不进,这样当第二次来时一定是被定义过的
struct s
{
  int a;
};
#endif//结束
//或则还可以更简单的写成
#pragma once//和上面的意思一样
struct s
{
  int a;
};

本章完。预知后事如何,暂听下回分解。

相关文章
|
6天前
|
C语言
第一章 C语言知识点(程序)
第一章 C语言知识点(程序)
16 0
|
4天前
|
存储 自然语言处理 编译器
C语言:编译与链接
C语言:编译与链接
6 1
|
4天前
|
存储 自然语言处理 编译器
“ Hello world ”中的秘密之【C语言程序编译和链接】
作为C语言最经典的代码,大家都可以轻易写出。但是代码的运行过程却很少有人清楚,接下来我将介绍代码运行的奥秘。
15 0
|
6天前
|
自然语言处理 编译器 C语言
C语言程序编译和链接
在ANSI C的任何⼀种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。 第2种是执⾏环境,它⽤于实际执⾏代码。
|
12天前
|
存储 C语言
C语言进阶---------作业复习
C语言进阶---------作业复习
|
12天前
|
存储 Linux C语言
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-2
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
12天前
|
自然语言处理 Linux 编译器
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-1
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
12天前
|
存储 编译器 C语言
C语言进阶第十课 --------文件的操作-1
C语言进阶第十课 --------文件的操作
|
13天前
|
存储 程序员 C语言
C语言进阶第九课 --------动态内存管理-2
C语言进阶第九课 --------动态内存管理
|
13天前
|
编译器 C语言
C语言进阶第九课 --------动态内存管理-1
C语言进阶第九课 --------动态内存管理