C语言中define的用法

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

#define N 100

1

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


下面是define和const的区别:


define是宏定义,程序在预处理阶段将用define定义的内容进行了 替换 。因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。

而const定义的常量,在程序运行时,存在常量表中,且系统为它分配内存。

define定义的常量,预处理时只是直接进行了替换,因此在编译时不能进行数据类型检验。

而const定义的常量,在编译时进行严格的类型检验,可以避免出错。

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

————————————————

版权声明:本文为CSDN博主「in_nocence」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/in_nocence/article/details/78982086


·关于我们·免责声明·服务条款·RSS订阅·dede168.com技术支持

Copyright © 1998-2015  All rights reserved.