当前位置: 首页 > news >正文

C语言预处理学习笔记

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

相关文章:

  • Docker Desktop 入门教学
  • python组备赛笔记(基础篇)
  • 从零到一:构建现代 React 应用的完整指南
  • Netty入门详解
  • halcon机器视觉深度学习对象检测,物体检测
  • 自学FOC系列分享--SVPWM和clark 逆变换及代码实战
  • docker从容器中cp到本地、cp本地到容器
  • LabVIEW开发中的电机控制与相机像素差
  • Visual Studio中打开多个项目
  • 【微中子代理踩坑-前端node-sass安装失败】
  • 敏捷开发07:敏捷项目可视化管理-ScrumBoard(Scrum板)使用介绍
  • rust 实例化动态对象
  • IC卡、M1卡及各类卡的原理使用说明
  • 以太网的MAC(介质访问控制)详解
  • 前端知识点---vue的声明周期(vue)
  • RAGFLOW使用flask转发的open ai接口
  • C# 十六进制字符串转换为十进制
  • Error [ERR_REQUIRE_ESM]: require() of ES Module
  • 深入了解 DevOps 基础架构:可追溯性的关键作用
  • 深入理解 C++17 中的 std::atomic<T>::is_always_lock_free
  • 习近平在中共中央政治局第二十次集体学习时强调,坚持自立自强,突出应用导向,推动人工智能健康有序发展
  • 航行警告!黄海南部进行实弹射击,禁止驶入
  • 政治局会议深度|提出“设立新型政策性金融工具”有何深意?
  • 上海嘉定远香文化环启用,运动、看展、听歌“一站式解决”
  • 博物馆有一项活动40岁以上不能参加?馆方回应
  • 因商标近似李小龙形象被裁定无效,真功夫起诉国家知产局,法院判了