进阶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;
};

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

相关文章
|
4月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
10天前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
44 25
为什么C/C++编译腰要先完成汇编
|
6月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
131 1
|
6月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
171 1
|
6月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
257 0
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
92 5
|
3月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
92 4
|
3月前
|
程序员 编译器 C语言
C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项
本文深入解析C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项,并通过实际案例分析,展示预处理器指令在代码编写与处理中的重要性和灵活性。
91 2
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
87 1
|
3月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
74 2

热门文章

最新文章