浅谈关于C语言中#define的副作用

MFC虽然没有未来,但是我觉得MFC的思想还是有必要研究研究的,在MFC中或者一些底层代码的编写中,宏是相当好用的,为什么呢?因为宏只是简单的替换,不进行类型转换,替换就意味着灵活,而C语言编程的灵魂就是灵活啊。

但是在高级语言中,甚至C++中,是提倡用const的,不提倡用#define,因为#define有一定的副作用,玩不好就没命了。
这里我们讨论下#define的副作用。

# include <stdio.h>
# include <stdlib.h>
# define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
int main(void)
{
 int a = 5;
 int b = 0;
 CALL_WITH_MAX(++a,b);
 CALL_WITH_MAX(++a,b+20);
 return 0;
}

分析:
上面的问题,不知道大家有没有看出来。
对于CALL_WITH_MAX(++a,b);

1、a首先加1 ,变成了6

2、再和b进行比较,结果是a大,最后返回的结果是(++a),又被加1 ,最后的结果是7

对于CALL_WITH_MAX(++a,b+20);

1、a首先加1 ,变成了8
2、再和b进行比较,结果是a大,最后返回的结果是b,此时的b为20,那么a只加了一次,a的结果是8

# include <stdio.h>
# include <stdlib.h>
# define CALL_WITH_MAX(a,b) f((a) > (b) ? (a):(b))
void f(int x)
{
 printf("compare result = %d\n",x);
}
int main(void)
{
 int a = 5;
 int b = 0;
 printf("Initial value a = %d\n",a);
 CALL_WITH_MAX(++a,b);
 printf("excute the first a = %d\n\n",a);
 printf("Initial value a = %d\n",a);
 CALL_WITH_MAX(++a,b+20);
 printf("excute the second a = %d\n\n",a);

 return 0;
}

结果分析如下:

以上所述是小编给大家介绍的关于C语言中#define的副作用详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • c++ 尽量不要使用#define 而是用const、enum、inline替换。

    例如:这里程序文件开头有如下#define语句 复制代码 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 ... ... 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛出错误信息.如果该信息提示6.65这里有错误,Ok如果你运气好你正好记得或者程序简单一眼能找到6.65表示什么,如果程序很复杂,而且报出6.65的文件是引用该文件,不记得,那么你会困惑这是什么?或许会花大

  • C语言中的内联函数(inline)与宏定义(#define)详细解析

    先简明扼要,说下关键:1.内联函数在可读性方面与函数是相同的,而在编译时是将函数直接嵌入调用程序的主体,省去了调用/返回指令,这样在运行时速度更快. 2.内联函数可以调试,而宏定义是不可以调试的.内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline.下面详细介绍一下探讨一下内联函数与宏定义. 一.内联函数是什么?内联函数是代码被插入到调用者代码处的函数.如同 #define 宏(但并不等同,原因见下文),内联函数通过避免被调用的开销来提

  • C语言中#define与typedef的互换细节详解

    复制代码 代码如下: #include <stdio.h>/*<---------           #define    string    char *            ---->*/typedef   char *   string; int main(void){   string   a[] = {"I", "like", "to", "fight,"},   b[] = {"

  • 浅谈关于C语言中#define的副作用

    MFC虽然没有未来,但是我觉得MFC的思想还是有必要研究研究的,在MFC中或者一些底层代码的编写中,宏是相当好用的,为什么呢?因为宏只是简单的替换,不进行类型转换,替换就意味着灵活,而C语言编程的灵魂就是灵活啊. 但是在高级语言中,甚至C++中,是提倡用const的,不提倡用#define,因为#define有一定的副作用,玩不好就没命了. 这里我们讨论下#define的副作用. # include <stdio.h> # include <stdlib.h> # define C

  • C语言中#define预处理语法总结

    目录 一.使用#define定义标识符常量 语法1: 语法2: 二.#define来定义带有参数的宏 三.C语言给我们定义好的一些标识符常量 一.使用#define定义标识符常量 语法1: #define MAX 100 注意使用#define末尾不需要带; MAX是一个常量,是使用#define定义的一个标识符常量 !!! 我为什么要在这里强调这是一个常量呢?因为它和普通常量一样不可被修改 大家可能会疑惑使用const修饰的变量不也是不可被修改的吗,这两者有什么不同呢? 这里要强调一下,使用c

  • C语言中#define定义的标识符和宏实例代码

    目录 1.#define定义标识符 语法 举个栗子 2.#define定义宏 #define替换的规则 #与###的用法: 宏的缺点 宏和函数的优缺点 总结 1.#define定义标识符 在C语言程序中,有时候会包含#define #define可以定义标识符 也就是说可以对字符重新定义,实现代替的作用 语法 #define  name  stuff 就比如说: #define MAX 1000(用MAX代替1000) #define reg   register (用reg代替register

  • C语言中#define在多行宏定义出错的原因及分析

    目录 C语言中#define在多行宏定义出错的原因 1.第一种错误 2.第二种错误 使用#define宏定义的几个小技巧 1.调试开关 2.条件编译 3.宏实现函数 4.跨行宏定义 5.防止头文件被重复包含 6.带参宏与带参函数的区别 7.注意事项 总结 C语言中#define在多行宏定义出错的原因 1.第一种错误 #include<stdio.h> #define echange(a,b) {\/*宏定义中允许包含多行命令的情形,此时必须在最右边加上"\"*/  int

  • 浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char *strSrc) { char *res=strDest; assert((strDest!=NULL)&&(strSrc!=NULL)); while(*strDest)strDest++; while(*strDest=*strSrc) { strDest++; strSrc

  • 浅谈C语言中include""与include<>的区别

    新建控制台应用程序 Win32 Application和Win32 Console Application 都是工作在32位Windows环境的程序.其中: (1)Win32 Application就是普通的常见的窗口应用程序,当然有的界面做得比较个性化,比如圆形的.不规则形状的-它们都是所谓的GUI(Graphics User Interface图形用户接口),我们可以通过鼠标点击来完成控制.Win32 Application是为你开发windows应用程序所准备的,程序以WinMain()为

  • 浅谈C语言中的sizeof()和strlen()的区别

    目录 sizeof() strlen 补一个注意事项: sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别: sizeof() 1. sizeof()[操作数所占空间的字节数大小]是一种c中的基本运算符.可以以类型.指针.数组和函数等作为参数.返回值类型为unsigned int 运算值在编译的时候就出结果,所以可以用来定义数组维数. char a[5]="123"; int b=sizeof(a);//b=5 int c=strlen(a);//c=3 size

  • 浅谈#ifndef,#define,#endif的作用和用法

    问题:ifndef/define/endif"主要目的是防止头文件的重复包含和编译 ======================================================== 用法: .h文件,如下: #ifndef XX_H #define XX_H ... #endif 这样如果有两个地方都包含这个头文件,就不会出现两次包含的情况 .. 因为在第二次包含时 XX_H 已经有定义了,所以就不再 include了 ------------------------------

  • C语言中typedef的用法以及#define区别详解

    目录 1.简洁定义 2.为已有类型起别名 为字符数组起别名 为指针起别名 3.typedef 和 #define 的区别 总结 1.简洁定义 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样.而编程中起别名,是为了编程人员编程方便,例如: 定义如下结构体 struct stu { int ID; char name[20]; float score[3]; char *data; }; 要想定义一个结构体变量就得这样写: struct stu Marry://Marry是

随机推荐