深入理解C语言的define

上一篇讲到#include这个预编译指令,还有个常用的预编译指令:#define。它的表面意思是定义,通常被说成“定义常量”,但其真正作用是替换;

如:

#define SUCCESS 1

这整句话是定义一个宏替换,其中SUCCESS是宏名,后面的内容是值;

使用方式:

在接下来的程序中直接使用SUCCESS即可代表1了。但是SUCCESS不是一个变量,虽然外形像一个常量,它的值也确实不会改变。但是真正的常量是要会随着编译器走的,也就是在以后的调试中你可以打印某常量,如:const a=3;你是可以打印出a的值出来的。但是#define的东西在预编译的时候就被替换掉了,也就是说在编译的时候你已经看不到SUCCESS了,它被直接替换成1了,这也是和const的区别之一......这就是宏的使用,也是宏替换的使用。

下面来看#define到底有什么作用?

作用1:方便程序员来检测。

因为很多情况下比如你都可能用到1,如果你直接写成1,则很多地方都可能出现1,你后续来看,看到了1,很难马上知道该处的1是什么含义,得结合上下文来看,这样就让自己变得麻烦了。此中情况你就可以用这些宏来表示,这样可以“一目了然”,如你写SUCCESS,你能一下子知道是操作成功的意思。

作用2:方便维护。

如:可以用来定义数组容量

#define MAX_SIZE 100

后续使用的时候可以这样使用:

int a[MAX_SIZE];

以后如果容量少了,直接修改这个宏,则使用的地方都跟着得到最新的了,因为你会重新编译...

作用3:简化写法

如:可以这样的定义:

#define unsigned short UST

则后续的时候就可以这样的写了:

UST a;

作用4:它其实可以做其他的语言。

如:中文编程语言,易语言

如:这里用中文编程:

执行效果:

原因因为头文件里这样写的:

因为根据上一节知道.h是可以随便定义的...

这也就是为什么说C语言可以做其他编程语言的理由之一,如:C语言写PHP解释器,就可以造就出PHP编程语言了...

时间: 2024-11-06 14:55:41

深入理解C语言的define的相关文章

【转载】理解C语言中的关键字extern

原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻译了一下.(原文:http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/)   我确定这篇文章对c语言的初学者会有很大的帮助,因为这将使他们更好更熟练的使用c语言.所以就让我先来说说extern关键字在变量和函数上的应用.最基本

深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别

看来基础还是很重要的,基础不扎实就难以学好c语言,就别说写出高质量的c语言代码了.今天,我就被这个问题折磨的不行了,哈哈,不过现在终于明白了'\0' ,'0', "0" 之间的区别了.困惑和快乐与你分享! 首先比较一下'\0'和'0'的区别.有一个共同点就是它们都是字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节.请翻开你的ASCII字符集表吧,一般在你的C语言教材的附录上,没有的话网上查查哦.请看第一个ASCII码,对是0,对应的字符是(Null),其实就

理解C语言声明的优先级规则

A 声明从它的名字开始读取,然后按照优先级顺序依次读取. B 优先级从高到低依次是:    B.1 声明中被括号括起来的那部分    B.2 后缀操作符:         括号()表示这是一个函数,而         方括号[]表示这是一个数组.    B.3 前缀操作符:星号*表示 "指向-的指针". C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符.在其他情况下,const和(或)volatile关键字作用于它左边

C++ Primer 5 读书笔记 推荐序 像编译器一样来思考和理解C++语言

像编译器一样来思考和理解C++语言. C++标准库本身就是C++语法的最佳样例. 遵循 google C++ style guide 孟岩 推荐 CPPP 5  C++标准程序库 effective C++ C++ concurrency in action linux多线程服务端编程

用三分钟理解c语言sizeof

一.概念 sizeof是单目操作符,同++等操作符一样.作用是以字节形式输出操作对象所在储存大小. 二.用法 a.操作数据类型 如sizeof(int),输出int类型在内存中所占的字节长度,具体取决于具体环境,本机输出为4. b.操作变量 如 char a[6]; printf("%d\n" ,sizeof(a)),因为已经定义了char数组长度,所以输出值为6. 三.常见问题 有以下几个例子,需要引起注意: 例子1: int testSizeOf(char x[]) { retur

深入理解C语言的函数调用过程 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4240084.html 原文地址:深入理解C语言的函数调用过程 作者:wjlkoorey258 本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解.    先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include <stdio.h> int foo1(int m,int n,int p) { int x = m + n + p; ret

&quot;深入理解C语言&quot; 指针

本文对coolshell中的"深入理解C语言"这篇文章中提到的指针问题, 进行简要的分析. #include <stdio.h> int main(void){ int a[5]; printf("%x\n", a); printf("%x\n", a + 1); printf("%x\n", &a); printf("%x\n", &a + 1); return 0; } 假设

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

深入理解C语言函数指针(转)

本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声明也可写成:void myFun( int ); int main() { myFun(100);//一般的函数调用 return 0; } void myFun(int x) { printf("myFun: %d\n",x); } 我们一开始只是从功能上或者说从数学意义上理解myFun