3.01定义常量之define
2024-10-20 07:48:14
【注:本程序验证是使用vs2013版】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
/*
#define
1、定义一个标识符来表示一个常量。
2、特点:定义的标识符不占变量内存,占用的是程序空间的内存,预编译后这个符号就不存在了。
3、预编译所执行的操作就是简单的“文本”替换
4、使用:#define 标识符 常量 //注意, 最后没有分号
#undef M //宏的中止位置
*/ /*
1、宏只是简单的替换,在预编译时将程序中出现前面的内容,用后边的完全替换
*/
# define NUM // #undef 之前出现的 NUM 全部用5代替
#define b "at" //"at" 会在程序会完全替代 b
/*
#define c "at 宏定义也不是说后面东西随便写,不能把字符串的两个""拆开。
#define 0x abcd 宏定义前面的那个必须是合法的用户标识符
*/ /*
2、带参的宏,
每个宏变量都要加括号 遇到MAX(1+2,value)则会把它替换成:((1+2)>(value)?(1+2):(value))
如果不括起来, 遇到MAX(1+2,value)则会把它替换成: 1+2>value?1+2:value 这样什么运算都不是了,会报错
*/
#define MAX(a,b) ((a)>(b)?(a):(b)) /*
3、'#'用于把宏定义中的参数两端加上字符串的""
比如,这里STR(my#name)会被替换成"my#name"
一般由任意字符都可以做形参,但以下情况会出错:
STR())这样,编译器不会把“)”当成STR()的参数。
STR(, )同上,编译器不会把“, ”当成STR的参数。
STR(A, B)如果实参过多,则编译器会把多余的参数舍去。(VC++2008为例)
STR((A, B))会被解读为实参为:(A, B),而不是被解读为两个实参,第一个是(A第二个是B)。
*/
#define STR(str) #str /*
4、‘##’用于实现函数实参中多个参数的 使用
例如:#define FUN(a,b) vo##a##b()
那么FUN(id ma,in)会被替换成void main()
*/ /*
5、多行宏定义
#define doit(m,n) for(int i=0;i<(n);++i)\
{\
m+=i;\
}
*/ int main(void){
int a= NUM;
printf("a=%d\n",b);
#undef NUM
//int a2= NUM; //这里再使用NUM就会报错 printf("%s\n", b);
printf("MAX(1,2) = %d\n",MAX(,));
printf("\n");
system("pause");
return ;
}
最新文章
- 苹果公布WWDC2016时间 并做了个程序员情怀网页
- mysql和oracle jdbc连接
- Response.Redirect()、Server.Execute和Server.Transfer的区别
- struts2 标签为简单标签
- winform form
- TSQL基础(三)
- MenuItem
- 转载MSDN 在ASP.NET 中执行 URL 重写
- BZOJ 1629: [Usaco2007 Demo]Cow Acrobats
- Web---图片验证码生成教程详解-从简单到复杂-从本地到前后台
- 关于__irq 的使用
- 安装完Apache和PHP之后访问PHP文件页面提示下载而没有解析 解决办法
- 对list代理扩展功能
- MacBook USB Type-C接口很美?其实是缩水的!
- 【STL】reverse函数用法
- Flutter 布局(五)- LimitedBox、Offstage、OverflowBox、SizedBox详解
- 配置SAP GUI FOR HTML(通过WEB方式登录)
- eclipse使用struts2找不到action方法或找不到action的错误记录
- identity一些接口
- Properties (25)