码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++ 宏操作小技巧

时间:2019-04-28 18:45:39      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:自己   order   min   运行时   操作   argc   abs   fine   typeof   

 Abstract

之前写了一个非常mini的log库(也不算库把,自己瞎jb写的),里面几乎都是宏的实现。这里打算趁热打铁,把自己知道的几下子都贴出来,后续如果有新的收获会更新这个博文。

文笔拙劣,主要是给自己做个提醒。

1. 运行时检测大小端

一目了然,不做解释。

#define __ENDIAN() ({         short _a = 0x1234;         *((char*)&_a) == 0x12 ? 1 : 0;     })
#define big_endian()  (__ENDIAN() == 1)
#define little_endian()  (__ENDIAN() == 0)

 当然还有另一种方式去确定字节序。下面是编译时确定字节序的方式。

只要通过引入头文件<endian.h>便可以在编译时通过宏判断字节序了。参考 ‘/usr/include/linux/tcp.h’ 你会发现另一种写法(自己去看下)。

#if __BYTE_ORDER == __LITTLE_ENDIAN
    // do_sth();
#elif __BYTE_ORDER == __BIG_ENDIAN
    // do_sth();
#else
#error "Unknown byte order"
#endif

 

2. max函数与min函数

max与min函数是最常用的。我们可以有很多方式去实现它,宏,inline,函数等。

由于这两个函数都很小,一般不建议

#define max(a, b) ({         typeof(a) _a = a;         typeof(b) _b = b;         _a >= _b ? _a : _b;     })

 

3. SDK 中的函数名拼接

#include <stdio.h>

#define test(__DOC, args) __SDK_##__DOC##_TEST(args)
void __SDK_V1_TEST(int a) {
    fprintf (stdout, "version %d\n", a);
    return;
}

void __SDK_V2_TEST(int a) {
    fprintf (stdout, "version %d\n", a);
    return;
}

int main(int argc, char **argv) {
    test(V1, 1);
    test(V2, 2);
    return 0;
}

 

C/C++ 宏操作小技巧

标签:自己   order   min   运行时   操作   argc   abs   fine   typeof   

原文地址:https://www.cnblogs.com/sinpo828/p/10785636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!