#define
符号常量
符号常量用 C 预处理器
来定义, 即 #define
指令.
符号常量也可称为明示常量 (manifest constant).
通用格式为:
#define NAME value
注意, 结尾不加分号, 因为这是由预处理器处理的替换机制.
符号常量的命名规则和普通的变量一样.
程序示例:
#include<stdio.h> #define N 10 int main(void) { int arr[N] = { 10 }; return 0; }
程序可以通过编译.
符号常量是常量的一种, 所以可以作为数组的元素个数.
在编译时, 程序中的 N 全部被替换为 10, 这称为 编译时替换
(compile-time substitution). 在程序运行时, 所有的替换都已经完成.
#define
可以定义字符 (用单引号括起来) 和字符串 (用双引号括起来).
示例:
#define BEEP '\a' #define ESC '\033' #define OPS "Hello, world!"
替换时发生错误
#define
命令起到复制粘贴的作用. 没有边界检查, 简单的字符串替换会导致边界效应.
// 错误示例 #define OOP = 20 // 此时将用 = 20 替换 OOP
#define 和 #undef 配合使用
#define
不能重复定义, 可以使用 #undef
命令后再重新定义.
程序示例:
#include <stdio.h> #define A 1 #define B A + 1 #define C A / B * 3 int main(void) { printf("%d\n", C); // 复制粘贴的过程: C 应为 A / A + 1 * 3, 再替换, 得 1 / 1 + 1 * 3, 则 C 为4 return 0; }
结果:
10
程序示例:
#include <stdio.h> #define A 1 #define B (A + 1) #define C A / B * 3 int main(void) { printf("%d\n", C); // 复制粘贴的过程. C应为 A / (A + 1) * 3, 再替换, 得1 / (1 + 1) * 3, 则 C 为0 return 0; }
结果:
0
#define
命令在预处理时起作用, 所以没法调试.
程序示例:
#include <stdio.h> #define INT int int main(void) { INT a = 10; printf("%d\n", a); return 0; }
#define 结合 #ifdef, #ifndef, #endif 一起使用
#define
可以结合 #ifdef
, #ifndef
, #endif
一起使用. 比如可以用 #define
开启或关闭调试信息.
程序示例:
#include <stdio.h> #define DEBUG int main(void) { #ifdef DEBUG printf("调试信息. \n"); #endif #ifndef DEBUG printf("没有调试. \n"); #endif return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术