C语言中define的用法

1 .最简单且最常见的define用法

#define N 100

编译器在预处理程序时,会将程序中所有的N用100来替换,换言之,不同于const常量,define其实本质上对文本内容的替换。

下面是define和const的区别:

  1. define是宏定义,程序在预处理阶段将用define定义的内容进行了 替换 。因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
    而const定义的常量,在程序运行时,存在常量表中,且系统为它分配内存。
  2. define定义的常量,预处理时只是直接进行了替换,因此在编译时不能进行数据类型检验。
    而const定义的常量,在编译时进行严格的类型检验,可以避免出错。
  3. define定义表达式时要注意“边缘效应”
    例如:
#define N 1+2 
float a = N/2.0;
/*
按照常规做法,可能会认为结果是3/2 = 1.5
但是实际上,结果应该为1+2/2.0 = 2.0

若想要实现3/2,则#define N (1+2)
即为避免边缘效应,一定要加!括!号!
*/

2 .用define定义函数
举个例子:

#include<stdio.h>
#define PI 3.14
#define S(r) PI*r*r
int main(void)
{
    printf("area = %f", S(1+2));
    rerturn 0;
}

结果:
3.14*1+2*1+2 = 3.14+2+2 = 7.14

重要的事情再说一遍:宏其实就是一个简单的文本替换!

3 .不常用的define用法

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示x连接y
- 比如: int n = Conn(123,456);
- 结果: n=123456;
- char* str = Conn(“asdf”, “adf”);
- 结果: str = “asdfadf”;

而#@x,其实就是给x加上单引号,结果返回一个const char。
- 比如:char a = ToChar(1);
- 结果:a=’1’;

做个越界试验 char a = ToChar(123);结果是a=’3’; 但是如果参数超过四个字符,编译器就会报错!

至于#x,就是给x加上双引号

  • 比如:char* str = ToString(123132);
  • 结果:str=”123132”;

4 .定义宏和取消宏
定义宏使用#define
取消宏定义使用#undef

猜你喜欢

转载自blog.csdn.net/in_nocence/article/details/78982086