C语言预处理学习笔记

news/2025/2/21 5:25:52

1. 预处理器的功能

预处理器(Preprocessor)在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头,主要包括文件包含、宏定义、条件编译等功能。

2. 文件包含

文件包含功能用于在一个文件中包含另一个文件的内容,通常用于包含头文件。

2.1 #include 指令

#include指令用于包含头文件。头文件可以是标准库头文件或用户自定义头文件。

标准库头文件

标准库头文件使用尖括号<>括起来。

#include <stdio.h>
#include <stdlib.h>
用户自定义头文件

用户自定义头文件使用双引号""括起来。

#include "myheader.h"

3. 宏定义

宏定义用于定义宏常量和宏函数,便于代码的重用和管理。

3.1 定义宏常量

#define指令用于定义宏常量。

#define PI 3.14
#define MAX_SIZE 100

3.2 定义宏函数

宏函数是一种简单的文本替换,不进行参数类型检查和计算。

#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

3.3 取消宏定义

#undef指令用于取消宏定义。

#undef PI

4. 条件编译

条件编译用于根据条件选择性地编译代码,便于跨平台开发和调试。

4.1 #if#endif 指令

#if 指令用于在条件为真时编译代码块。

#define DEBUG 1

#if DEBUG
    printf("Debug mode\n");
#endif

4.2 #ifdef#endif 指令

#ifdef 指令用于在宏已定义时编译代码块。

#define FEATURE_ENABLED

#ifdef FEATURE_ENABLED
    printf("Feature is enabled\n");
#endif

4.3 #ifndef#endif 指令

#ifndef 指令用于在宏未定义时编译代码块。

#ifndef MAX_SIZE
    #define MAX_SIZE 100
#endif

4.4 #else#elif 指令

#else#elif 指令用于在条件为假时编译代码块。

#define VALUE 10

#if VALUE < 5
    printf("Value is less than 5\n");
#elif VALUE < 15
    printf("Value is less than 15\n");
#else
    printf("Value is 15 or greater\n");
#endif

5. 常用的预定义宏

预定义宏是编译器预定义的宏,可以在程序中使用。

5.1 __FILE__

__FILE__宏表示当前源文件的名称。

printf("Current file: %s\n", __FILE__);

5.2 __LINE__

__LINE__宏表示当前源文件的行号。

printf("Current line: %d\n", __LINE__);

5.3 __DATE__

__DATE__宏表示当前编译日期。

printf("Compile date: %s\n", __DATE__);

5.4 __TIME__

__TIME__宏表示当前编译时间。

printf("Compile time: %s\n", __TIME__);

5.5 __FUNCTION__

__FUNCTION__宏表示当前函数的名称。

void myFunction() {
    printf("Current function: %s\n", __FUNCTION__);
}

6. 宏和函数的区别

  • 宏在预处理阶段进行文本替换,不进行参数类型检查和计算。
  • 函数在编译阶段进行实际调用,具有参数类型检查和计算。

6.1 宏示例

#define SQUARE(x) ((x) * (x))

int main() {
    int a = 5;
    printf("Square of %d: %d\n", a, SQUARE(a));
    return 0;
}

6.2 函数示例

int square(int x) {
    return x * x;
}

int main() {
    int a = 5;
    printf("Square of %d: %d\n", a, square(a));
    return 0;
}

http://www.niftyadmin.cn/n/5860212.html

相关文章

java毕业设计之医院门诊挂号系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的医院门诊挂号系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 医院门诊挂号系统的主要使用者…

nodejs链接redis

本篇文章介绍nodejs连接redis&#xff0c;以及redis的基本使用。 安装redis。 cnpm i redis -S封装redis配置信息。 config/db.js // redis 配置 let REDIS_CONF // 开发环境 if (env dev) {REDIS_CONF {port: 6639,host: 127.0.0.1} } // 生产环境 if (env production) {R…

Stack和Queue—模拟实现,实战应用全解析!

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的Stack和Queue&#xff08;栈和队列&#xff09; 一&#xff1a;栈 1.1&#xff1a;栈的概念 …

c/c++蓝桥杯经典编程题100道(23)最小生成树

最小生成树&#xff08;MST&#xff09;问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 最小生成树&#xff08;MST&#xff09;问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;Kruskal算法&#xff08;基于并查集&#xff0c;难度★★★&#…

Linux System V - 消息队列与责任链模式

概念 消息队列是一种以消息为单位的进程间通信机制&#xff0c;允许一个或多个进程向队列中发送消息&#xff0c;同时允许一个或多个进程从队列中接收消息。消息队列由内核维护&#xff0c;具有以下特点&#xff1a; 异步通信&#xff1a;发送方和接收方不需要同时运行&#x…

58同城深度学习推理平台:基于Istio的云原生网关实践解析

在当今数字化时代&#xff0c;深度学习技术的快速发展为各行各业带来了革命性的变化。作为国内领先的分类信息网站&#xff0c;58同城一直致力于通过技术创新提升服务质量和用户体验。近期&#xff0c;58同城AI Lab推出了一项重要的技术革新——基于Istio的云原生网关深度学习推…

用DeepSeek来帮助学习three.js加载3D太极模形

画一个平面的太极图是很容易&#xff0c;要实现3D的应该会很难 一、参考3D模形效果 看某网页看到一个效果&#xff0c;像一个3D太极球&#xff0c;觉得挺有趣&#xff0c;挺解压的&#xff0c;想进一步去了解下这是如何实现 效果&#xff1a; 链接地址&#xff1a; http://www.…

python:多重继承、MRO(方法解析顺序)

在 Python 中&#xff0c;当类存在多重继承时&#xff0c;方法的调用顺序由 方法解析顺序&#xff08;Method Resolution Order, MRO&#xff09; 决定。 Python 使用 C3线性化算法 来确定类的继承顺序&#xff08;MRO&#xff09;&#xff0c;其核心规则是&#xff1a; 子类优…