易截截图软件、单文件、免安装、纯绿色、仅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下编译和安装软件的方法

For all those who are beginners in any linux(ubuntu) find hard to find the package files of their distro and end up in finding an source package(which is either in tar.gz or .gz).. so now people think how to install these source files…..
lets now see how would you be installing source files ......

几个Linux实用程序

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

在linux下 获取,修改子网掩码NETMASK的两个函数

//获取子网掩码的函数QString GetLocalNetMask()
{
int sock_netmask;
char netmask_addr[50];
struct ifreq ifr_mask;
struct sockaddr_in *net_mask;

sock_netmask = socket( AF_INET, SOCK_STREAM, 0 );
if( sock_netmask == -1)
{
perror("create socket failture...GetLocalNetMask\n");
......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号