深入理解 C 语言预处理的五个关键要点

预处理详解

预定义符号

预处理阶段可用的预定义符号包括:

  • __FILE__:当前编译源文件名
  • __LINE__:当前行号
  • __DATE__:编译日期
  • __TIME__:编译时间
  • __STDC__:若编译器遵循ANSI C标准则为1

示例:

c 复制代码
printf("%s %d %s %s\n", __FILE__, __LINE__, __DATE__, __TIME__);
宏定义基础

宏定义通过#define实现纯文本替换:

c 复制代码
#define MAX 7777
#define reg register
#define do_forever for(;;)
#define CASE break;case
函数式宏

函数式宏需注意括号和优先级:

c 复制代码
#define SQUARE(x) ((x)*(x))
#define DOUBLE(x) ((x)+(x))
#define MAX(a,b) (((a)>(b))?(a):(b))

常见陷阱:

  • 参数未加括号导致运算优先级错误
  • 宏展开后产生多余分号
  • 参数含副作用时多次求值
宏操作符
  • #:字符串化操作符
c 复制代码
#define STR(x) #x
// STR(hello) → "hello"
  • ##:记号拼接操作符
c 复制代码
#define CAT(a,b) a##b
// CAT(int,_max) → int_max
条件编译

通过预定义宏控制编译流程:

c 复制代码
#if defined(DEBUG)
    #define LOG(fmt, ...) printf("[D] " fmt "\n", ##__VA_ARGS__)
#else
    #define LOG(fmt, ...) ((void)0)
#endif
头文件保护

防止头文件重复包含的两种方式:

  1. 头卫士(推荐):
c 复制代码
#ifndef TEST_H
#define TEST_H
/* 头文件内容 */
#endif
  1. 编译器扩展:
c 复制代码
#pragma once
实用技巧
  1. 调试宏:
c 复制代码
#define DEBUG_PRINT() \
    printf("file:%s line:%d date:%s time:%s\n", \
           __FILE__, __LINE__, __DATE__, __TIME__)
  1. 命令行定义:
bash 复制代码
gcc -D ARRAY_SIZE=10 program.c
  1. 宏取消定义:
c 复制代码
#undef SYMBOL
注意事项
  1. 续行符\后不能有任何字符(包括空格)
  2. 宏定义末尾避免加分号
  3. 优先使用函数而非宏的场景:
    • 复杂逻辑
    • 需要递归
    • 参数含副作用
  4. 命名约定:宏全大写,函数不全大写

编程语言C++mobile.hbqisen.com++C语言的魅力

编程语言C++news.hbqisen.com++C语言的魅力

编程语言C++soft.hbqisen.com++C语言的魅力

编程语言C++www.share.hbqisen.com++C语言的魅力

编程语言C++map.hbqisen.com++C语言的魅力

编程语言C++www.blog.hbqisen.com++C语言的魅力

编程语言C++read.share.hbqisen.com++C语言的魅力

编程语言C++info.hbqisen.com++C语言的魅力

编程语言C++hbqisen.com++C语言的魅力

编程语言C++www.hbqisen.com++C语言的魅力

编程语言C++mobile.ptjc8282.com++C语言的魅力

编程语言C++news.ptjc8282.com++C语言的魅力

编程语言C++soft.ptjc8282.com++C语言的魅力

编程语言C++www.share.ptjc8282.com++C语言的魅力

编程语言C++map.ptjc8282.com++C语言的魅力

编程语言C++www.blog.ptjc8282.com++C语言的魅力

编程语言C++read.share.ptjc8282.com++C语言的魅力

编程语言C++info.ptjc8282.com++C语言的魅力

编程语言C++ptjc8282.com++C语言的魅力

编程语言C++www.ptjc8282.com++C语言的魅力

编程语言C++mobile.nmpengyangjidian.com++C语言的魅力

编程语言C++news.nmpengyangjidian.com++C语言的魅力

编程语言C++soft.nmpengyangjidian.com++C语言的魅力

编程语言C++www.share.nmpengyangjidian.com++C语言的魅力

编程语言C++map.nmpengyangjidian.com++C语言的魅力

编程语言C++www.blog.nmpengyangjidian.com++C语言的魅力

编程语言C++read.share.nmpengyangjidian.com++C语言的魅力

编程语言C++info.nmpengyangjidian.com++C语言的魅力

编程语言C++nmpengyangjidian.com++C语言的魅力

编程语言C++www.nmpengyangjidian.com++C语言的魅力

编程语言C++mobile.dayugame520.com++C语言的魅力

编程语言C++news.dayugame520.com++C语言的魅力

编程语言C++soft.dayugame520.com++C语言的魅力

编程语言C++www.share.dayugame520.com++C语言的魅力

编程语言C++map.dayugame520.com++C语言的魅力

编程语言C++www.blog.dayugame520.com++C语言的魅力

编程语言C++read.share.dayugame520.com++C语言的魅力

编程语言C++info.dayugame520.com++C语言的魅力

编程语言C++dayugame520.com++C语言的魅力

编程语言C++www.dayugame520.com++C语言的魅力

编程语言C++mobile.dl-freedom.com++C语言的魅力

编程语言C++news.dl-freedom.com++C语言的魅力

编程语言C++soft.dl-freedom.com++C语言的魅力

编程语言C++www.share.dl-freedom.com++C语言的魅力

编程语言C++map.dl-freedom.com++C语言的魅力

编程语言C++www.blog.dl-freedom.com++C语言的魅力

编程语言C++read.share.dl-freedom.com++C语言的魅力

编程语言C++info.dl-freedom.com++C语言的魅力

编程语言C++dl-freedom.com++C语言的魅力

编程语言C++www.dl-freedom.comC语言的魅力

编程语言C++mobile.yaxinguanzhuang.com++C语言的魅力

编程语言C++news.yaxinguanzhuang.com++C语言的魅力

编程语言C++soft.yaxinguanzhuang.com++C语言的魅力

编程语言C++www.share.yaxinguanzhuang.com++C语言的魅力

编程语言C++map.yaxinguanzhuang.com++C语言的魅力

编程语言C++www.blog.yaxinguanzhuang.com++C语言的魅力

编程语言C++read.share.yaxinguanzhuang.com++C语言的魅力

编程语言C++info.yaxinguanzhuang.com++C语言的魅力

编程语言C++yaxinguanzhuang.com++C语言的魅力

编程语言C++www.yaxinguanzhuang.com++C语言的魅力

编程语言C++mobile.daoios.com++C语言的魅力

编程语言C++news.daoios.com++C语言的魅力

编程语言C++soft.daoios.com++C语言的魅力

编程语言C++www.share.daoios.com++C语言的魅力

编程语言C++map.daoios.com++C语言的魅力

编程语言C++www.blog.daoios.com++C语言的魅力

编程语言C++read.share.daoios.com++C语言的魅力

编程语言C++info.daoios.com++C语言的魅力

编程语言C++daoios.com++C语言的魅力

编程语言C++www.daoios.com++C语言的魅力

相关推荐
优橙教育1 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
我叫洋洋3 小时前
C ++ [ hello world ]
c语言·c++·算法
SeaTunnel3 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影3 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
天空'之城3 小时前
C 语言工业级通用组件手写 09:CRC32 数据校验
c语言·嵌入式开发·数据校验·crc32·工业级组件
Marst Code4 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Miao121314 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城6 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience7 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
我的xiaodoujiao7 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具