#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;
}
posted @   有空  阅读(68)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示

目录导航