易截截图软件、单文件、免安装、纯绿色、仅160KB

LINUX内核中min和max宏的学习

add linux kernel min, max define:
include/linux/kernel.h
/*
 * min()/max() macros that also do
 * strict type-checking.. See the
 * "unnecessary" pointer comparison.
 */
#define min(x,y) \
(__extension__\
({ \
        typeof(x) _x = (x);     \
        typeof(y) _y = (y);     \
        (void) (&_x == &_y);            \
        _x < _y ? _x : _y; })     \
)
#define max(x,y) \
(__extension__\
({ \
        typeof(x) _x = (x);     \
        typeof(y) _y = (y);     \
        (void) (&_x == &_y);            \
        _x > _y ? _x : _y; })     \
)
 
 
如上是include/linux/kernel.h中关于min和max两个很常用的宏的定义,在其中我们可以看到以下几个关键点:
1. 为何不用更简单的(x>y)?x:y 这样的方式来定义,而要重新赋值一次。
2. 为何要用({  })这样的结构包围代码块
3. 那个__extension__是什么东东? (有的版本没有这个__extension__)
4. (void)(&_x == &_y)有什么用,不是脱了裤子放屁么
 
 
 
解答:
1. 如果用户使用了min(x++,y++)会有怎样的结果?
   所以最好的办法是避免在宏的实体里让参数出现一次以上。老的linux用的是 x>?y,这个>?操作符是返回x和y中较大的一个,不过GCC的文档里已经决定抛弃这种老的用法了。
 
 
2. GCC的扩展里像{ }这种结构也是可以有值的,其值就是其中最后一个语句的值(包括左值),这里外面再加个括号是为了保险,比如:
   printf("猜猜会显示什么?\n答案是:%d\n",({
         &


相关文档:

实战Linux Bluetooth编程(六) L2CAP编程实例

例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
 如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......

实战Linux Bluetooth编程 (七) SDP协议

Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......

Windows完成端口与Linux epoll技术简介

Windows完成端口与Linux epoll技术简介
2009-09-16 09:13
WINDOWS完成端口编程
1、基本概念
2、WINDOWS完成端口的特点
3、完成端口(Completion Ports )相关数据结构和创建
4、完成端口线程的工作原理
5、Windows完成端口的实例代码
Linux的EPoll模型
1、为什么select落后
2、内核中提高I/O性能的新方法epoll
3 ......

几个Linux实用程序

1. useradd 用户名
useradd命令负责添加用户到Linux系统(只有管理员可以使用这个命令)。
例:
useradd tom
2.userdel 用户名
userdel命令删除一个用户账户(只有管理员可以使用这个命令)。
例:
userdel tom
3.passwd 用户名
当创建一个用户之后需要为用户设置密码,passwd 可以完成此功能。当passwd后面没有参 ......

在linux下 获取本机MAC地址的函数

//获取本机MAC地址函数QString GetLocalMac()
{
int sock_mac;

struct ifreq ifr_mac;
char mac_addr[30];

sock_mac = socket( AF_INET, SOCK_STREAM, 0 );
if( sock_mac == -1)
{
perror("create socket falise...mac\n");
return "";
}

memset(&ifr_mac,0,sizeof(ifr_mac));
......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号