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

C 预处理器:编译前的文本魔法

一、引言

在 C 语言编程里,C 预处理器虽非编译器的一部分,但却是编译流程中独立且关键的环节。它本质上是个文本替换工具,会在实际编译前完成预处理工作,我们常将其简称为 CPP。

二、预处理器指令

所有预处理器命令都以井号(#)开头,且最好从第一列开始以增强可读性。下面是重要指令介绍:

指令描述
#define定义宏
#include包含源代码文件
#undef取消已定义的宏
#ifdef若宏已定义,返回真
#ifndef若宏未定义,返回真
#if给定条件为真,编译下面代码
#else#if 的替代方案
#elif前面 #if 条件为假,当前条件为真,编译下面代码
#endif结束 #if...#else 条件编译块
#error遇到标准错误,输出错误消息
#pragma向编译器发布特殊命令

示例

#define MAX_ARRAY_LENGTH 20
#include <stdio.h>
#include "myheader.h"
#undef  FILE_SIZE
#define FILE_SIZE 42
#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif
#ifdef DEBUG
   /* Your debugging statements here */
#endif

三、预定义宏

ANSI C 定义了不少宏,可在编程中使用,但不能修改。

描述
__DATE__当前日期,格式 "MMM DD YYYY"
__TIME__当前时间,格式 "HH:MM:SS"
__FILE__当前文件名,字符串常量
__LINE__当前行号,十进制常量
__STDC__编译器以 ANSI 标准编译时,定义为 1

示例

#include <stdio.h>
 
main()
{
   printf("File :%s\n", __FILE__ );
   printf("Date :%s\n", __DATE__ );
   printf("Time :%s\n", __TIME__ );
   printf("Line :%d\n", __LINE__ );
   printf("ANSI :%d\n", __STDC__ );
}

四、预处理器运算符

1. 宏延续运算符(\)

若宏过长,可用它分行书写。

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

2. 字符串常量化运算符(#)

把宏参数转为字符串常量。

#include <stdio.h>
 
#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")
 
int main(void)
{
   message_for(Carole, Debra);
   return 0;
}

3. 标记粘贴运算符(##)

合并两个参数。

#include <stdio.h>
 
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
 
int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

4. defined() 运算符

用于常量表达式,判断标识符是否用 #define 定义过。

#include <stdio.h>
 
#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif
 
int main(void)
{
   printf("Here is the message: %s\n", MESSAGE);  
   return 0;
}

五、参数化的宏

可模拟函数,如计算平方:

#define square(x) ((x) * (x))
#include <stdio.h>
 
#define MAX(x,y) ((x) > (y) ? (x) : (y))
 
int main(void)
{
   printf("Max between 20 and 10 is %d\n", MAX(10, 20));  
   return 0;
}

C 预处理器功能强大,掌握它能让 C 语言编程更加高效和灵活。

相关文章:

  • 【安当产品应用案例100集】042-基于安当KADP实现机密文件安全流转
  • 一篇就够!Windows上Docker Desktop安装 + 汉化完整指南(包含解决wsl更新失败方案)
  • 状态码返回
  • 2025 年前端新趋势:拥抱 Web Component 与性能优化
  • 智能家居赋能宠物经济:未来宠物行业的另一片蓝海
  • 优雅处理拼音输入:jQuery实现中文输入法状态检测的最佳实践
  • mysql 索引
  • 蓝桥杯嵌入式第十二届程序设计题
  • 海康gdb流程
  • 【算法题讲解】45. 跳跃游戏 II
  • 如何选择适合你的美颜SDK?人脸美型功能对比与应用场景分析
  • C语言中的位域:节省内存的标志位管理技术
  • CTF类题目复现总结-[MRCTF2020]ezmisc 1
  • 交流电机类型及其控制技术
  • 淘宝商品数据清洗实战:从复杂JSON到结构化数据库(附Python脚本)
  • LeeCode 434. 字符串中的单词数
  • Spring Initializr搭建spring boot项目
  • 软件工程面试题(七)
  • 格雷码和汉明码的详细总结
  • Linux中安装宝塔面板
  • 找个做网站的/西安网络推广运营公司
  • 网站建设160页答案/网络营销百度百科
  • 阿里巴巴吧国际网站怎么做/大数据分析师
  • 做动态的网站的参考资料有哪些/手机如何建网站
  • 网站建设重点/宁波seo公司网站推广
  • 网站建设上海网站建设/在线培训课程