3.01定义常量之define

【注:本程序验证是使用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 5        //  #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(1,2));
   printf(
"\n"); system("pause"); return 0; }

 

posted @ 2019-07-01 06:41  大黄蜂_001  阅读(796)  评论(0编辑  收藏  举报