一天一个C Run-Time Library 函数(2) __max & __min

本文详细介绍了C语言中的__max和__min函数,包括它们在头文件<stdlib.h>中的定义、如何使用这两个函数来找出两个值中的最大值和最小值,以及如何在实际编程中避免使用可能导致移植性问题的宏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一天一个C Run-Time Library 函数(2) __max & __min

write by 九天雁翎(JTianLing) -- blog.youkuaiyun.com/vagrxie<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

头文件 <stdlib.h>

msdn:

Returns the larger of two values.

type __max(

type a,

type b

);

Returns the smaller of two values.

type __min(

type a,

type b

);

测试程序:

#include <stdlib.h>

#include <stdio.h>

int main( void )

{

int a = 10;

int b = 21;

printf( "The larger of %d and %d is %d/n", a, b, __max( a, b ) );

printf( "The smaller of %d and %d is %d/n", a, b, __min( a, b ) );

}

说明:

这次的测试程序因为MSDN中有sample,就使用了他们原来的程序,起码能够说明问题吧,其实作为一个本意是用来说明移植性的文章系列中,没有samlple也无所谓的。

又是两个双前置下划线的函数,事实上C语言参考和TCPL中也都没有说明,估计还是属于MS自己加的。

gcc无此函数,鉴于此函数的实用性,自然也需要实现一份。

对于这么简单的函数也就不多说明了,不然又太过了。

实现:

MS:

#define __max(a,b) (((a) > (b)) ? (a) : (b))

#define __min(a,b) (((a) < (b)) ? (a) : (b))

还是简单的宏,对于一个C++程序员来说,我不是太习惯,可能我属于原教义派,看多了Bjarne Stroustrup的书,心中总是对于宏有所排斥,我以前就因为被windows一个简单的宏折磨的够呛。那个宏也是关于最大,最小的,我在http://blog.youkuaiyun.com/vagrxie/archive/2007/07/06/1680398.aspx

一文中有所描述。

简而言之,就是windows.h中(实际定义在windef.h中,但是windows.h包含了windef.h,而windows.h才是经常包含的文件)

不知道新的C语言中有没有inline,实话说,那样要好的多。

#ifndef NOMINMAX

#ifndef max

#define max(a,b) (((a) > (b)) ? (a) : (b))

#endif

#ifndef min

#define min(a,b) (((a) < (b)) ? (a) : (b))

#endif

#endif /* NOMINMAX */

这样的效果是,所有的min,max都会被宏替换,甚至是

std::numeric_limits<T>::min()

或者

#include "windows.h"

class max

{

};

int main( void )

{

max* lpmax = new max();

return 0;

}

这样的形式都会导致编译通不过,而第一种情况那可是C++标准库使用numeric_limits特性必须的。因为MS也给出了解决的方式。预先定义一个NOMINMAX的宏就能解决问题。

不知道新的C语言中有没有inline,实话说,那样要好的多。C语言运行库中再次实现了最大最小的函数,不过以双前置下划线的方式可以极大的防止宏替换的意外情况。

C语言就得习惯宏,用C++我常常迫使自己忘记宏,有的时候感觉CC++的区别还是挺大的,特别是C99以后。。。。。。。

对了,对于所有还不习惯C语言大面积用宏的兄弟说一句,这样的宏引进了这么多麻烦,其实还是有一个好处的,那就是省略了一次函数的调用。函数的调用在C /C++中开销不算太大,但是在高效率的要求下也不算小,可以看看以前我分析c++函数调用的文章。

http://blog.youkuaiyun.com/vagrxie/archive/2008/06/01/2501238.aspx

作为C语言来说,很多时候自然都是效率之上了。

效率测试:

略。

相关函数:

无。

个人想法:

虽然感觉这两个函数是会很常用到的,但是实际工作中还真没有用过一次。。。说实话,并不是没有这两个函数适用的场合,而是这样的场合自己用?:实现也很简单,所以常常根本想不到还有这样的两个函数可以实现,我更加是没有准备使用windows.hmax,min宏的想法,很简单就可以做到的事情,为什么要使用以导致移植性的降低了,没有理由。

write by 九天雁翎(JTianLing) -- blog.youkuaiyun.com/vagrxie

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值