宏的副作用

#include <stdio.h>
#define min(a,b) ((a)<=(b)?(a):(b))

int main (int argc, char **argv)
{
    char *p = "abcdefgh";
    printf("%c\n",min(*p++,‘c‘));  //宏被扩展为 ( *p++ <= c ? *p++:c )
    return 0;
}

输出

b

我们可以看到,宏只是简单的替换,这个例子如何避免副作用呢?可以使用if-else 语句改写。

时间: 2024-10-15 00:54:33

宏的副作用的相关文章

简述C语言中宏的作用及其副作用

引问:写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个? 答案:#define  MIN(A,B)  ( (A) <= (B)? (A) : (B) ) 知识梳理: 1). 标识#define在宏中应用的基本知识.直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法, 对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法. 2). 三重条件操作符的知识.这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更

第46课 函数与宏分析

1. 函数与宏 (1)宏是由预处理直接替换展开的,编译器不知道宏的存在 (2)函数是由编译器直接编译的实体,调用行为由编译器决定 (3)多次使用宏会导致最终可执行程序的体积增大 (4)函数是跳转执行的,内存中只有一份函数体存在 (5)宏的效率比函数要高,因为是直接展开,无调用开销 (6)函数调用时会创建活动记录,效率不如宏 [编程实验]函数与宏 #include <stdio.h> #define RESET(p,len) while( len > 0) ((char*)p)[--len

C语言之宏

所谓的宏就是一种预处理命令,什么是与处理呢?即在编译过程之前先对程序代码做出的必要的转换处理.宏有两个作用: 1.当遇到需要将程序某个特定的数量在程序中出现的所有实例通通加以修改时,程序只需改动一处即可. 2.大多数C语言函数调用时都会带来重大的系统开销,而宏看上去像一个函数却没有函数调用的开销. 宏虽然有优点,但是也有其自身的缺陷. 首先得明确宏只是简单地替换.例如 #define CHAR char* Int main() { Char a=’A’; CHAR  p1,p2; P1=&a;

宏和函数

此为C语言的基础,和Linux内核关系并不大,不过还是作为补充知识点介绍一下好了.宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个: #define MAX(a,b) ((a)>(b)?(a):(b)) 如果使用函数来实现的话就比较慢,宏的话在编译的时候就完成工作,所以使用宏远比使用函数调用效率来的可观.和使用函数相比,使用宏的不利之处就在于每次使用宏的时候,一个宏定义代码的拷贝就插入到程序中,这样会增加程序的长度.除非非常的短,否则使用宏可能大幅增加程序的长度. 1.宏的副

宏define

Q:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个 A: #define MIN(A,B)  ((A) <= (B) ?(A):(B)) 这个测试为这些目的而设: 1).标识#define在宏中应用的基本知识.直到嵌入(inline)操作符变为标准C 的一部分.是方便产生嵌入代码的唯一方法.对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法. 2).三重条件操作符的知识.这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码.了解这个用

C之函数与宏(四十)

在 C 语言中,我们经常会遇到函数和宏,那么我们今天就来分析下函数与宏. 我们先来看看函数与宏有什么区别:a> 宏是由预处理期直接替换展开的,编译器不知道宏的存在:b> 函数是由编译器直接编译的实体,调用行为由编译器决定:c> 多次使用宏会导致最终可执行程序的体积增大:d> 函数是跳转执行的,内存中只有一份函数体存在:e> 宏的效率比函数要高,因为是直接展开,没有调用开销:f> 函数调用时会创建活动记录,效率不如宏. 下来我们以代码为例进行分析,代码如下 #includ

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

iOS面试必备-iOS基础知识

近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内存管理机制:使用引用计数管理,分为ARC和MRC,MRC需要程序员自己管理内存,ARC则不需要.但是并不是 所有对象在ARC环境下均不需要管理内存,子线程和循环引用并不是这样.与retain配对使用的是release,retain代表引用计 数+1,release代表引用计数-1,当引用计数减为0时

转:从《The C Programming Language》中学到的那些编程风格和设计思想

这儿有一篇写的很好的读后感:http://www.cnblogs.com/xkfz007/articles/2566424.html 读书不是目的,关键在于思考. 很早就在水木上看到有人推荐<The C Programming Language>这本书,一直都没看,开学一个月就专心拜读了一下,并认真做了课后习题.读来收获不少,主要有两点:一是加深了自己对一些基础知识的理 解和感悟:二是从中学到了一些不错的编程风格和设计思想,这些东西虽看起来不起眼但细细嚼来还是很值得学习的.下面就从四个方面做一