gnc cc扩展标准c的语法,非常强大!!!详情请见:

http://uw714doc.sco.com/cgi-bin/info2html?%28gcc.info%29C%2520Extensions&lang=en

http://tigcc.ticalc.org/doc/gnuexts.html#SEC104

https://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/C-Extensions.html#C-Extensions

ABI是application binary interface的缩写,规定了struct布局,函数调用规则,数据大小等。

非常值得研究。

比如:x86-64下,rbx,rbp,r12-r15是called saved registers。

参考文献:http://www.x86-64.org/documentation/abi.pdf

people.freebsd.org/~obrien/amd64-elf-abi.pdf

 #define my_min(x, y)  ({const typeof(x) __x = x; \
     const typeof(y) __y = y; \
     (void) (&__x == &__y); \
     __x < __y ? __x : __y;})

 struct Str
 {
     int a;
     char b;
     short c;
 } __attribute__((packed));

 #define ERR_PRINTF(fmt, args...) {\
     ]; \
     snprintf(msg, sizeof(msg), "%s:%d "fmt"\n", __FUNCTION__, __LINE__, ##args);\
     printf("%s", msg); \
 }

 #define ERR_PRINTF2(fmt, ...) \
     printf("%s:%d "fmt"\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)

 #define likely(x)  __builtin_expect((x), 1)
 #define unlikely(x)  __builtin_expect((x), 0)

 __attribute__ ((noinline))   bool CAS_64b(uint64_t* ptr, uint32_t* oldv, uint32_t* newv)
 {
     bool ret = false;
     __asm__ __volatile__ (
         "pushl %%ebx;"
         "movl %4, %%ebx;"
         "lock cmpxchg8b %1;\n"
         "sete %0;\n"
         "popl %%ebx;\n"
         :"=m"(ret),"+m"(*(uint64_t volatile*)(ptr))
         :]), ]), ]), ])
         :"memory");
         return ret;
 }

 //#if defined(__x86_64__)
 //#define CAS(ptr, oldv, newv)  __sync_bool_compare_and_swap((uint64_t*)(ptr), *(uint64_t*)(&oldv), *(uint64_t*)(&newv))
 //#else
 #define CAS(ptr, oldv, newv) CAS_64b((uint64_t*)(ptr), (uint32_t*)(&oldv), (uint32_t*)(&newv))
 //#endif
 struct A
 {
     int a;
     int b;
 };

 void test_CAS()
 {
     , };
     , };
     struct A sc = sa;
     if(CAS(&sc, sa, sb))
         printf("success, %d %d\n", sb.a, sb.b) ;
     else
         printf("fail, %d %d\n", sb.a, sb.b);
 }

 void f_unlikely()
 {
     printf("go unlikely\n");
 }

 void f_likely()
 {
     printf("go likely\n");
 }

 void test_aligned(char* p)
 {
     )>>)<<);
     *(()) = ;
 }

 void test_likely(int x)
 {
     if(unlikely(x))
         f_unlikely();
     else
         f_likely();
 }

 void test_return_addr()
 {
     );
     printf("address \t %p\n", p);
 }

 void test_frame_addr()
 {
     );
     printf("address \t %p\n", p);
 }

 int main()
 {
     //typeof
     //statement expression
     , );
     printf("%d\n", c);

     //packed
     printf("sizeof(Str) = %u\n", (uint32_t)sizeof(Str));

     //##
     ERR_PRINTF();
     ERR_PRINTF("test2");

     ERR_PRINTF2();
     //printf("%s:%d ""test2""\n", __FUNCTION__, 80, ); // the , still exists
     ERR_PRINTF2("test2");

     //__builtin_expect
     test_likely();

     //__builtin_return_address
     test_return_addr();

     //__builtin_frame_address
     test_frame_addr();

     //test aligned
     ] = {};
     test_aligned(pp);

     //test CAS
     test_CAS();

     )
         sleep();
     ;
 }

执行结果:

[ ~/code/test_sighup]$ ./test_gcc_ex
1
sizeof(Str) = 7
main:120 1 test
main:121 test2
main:123 1 test
main:125 test2
go unlikely
address          0x804882b
address          0xffb33aa8
success, 3 4

objdump -DC ./test_gcc_ex

00000000004006a0 <test_likely(int)>:
  4006a0:       85 ff                   test   %edi,%edi
  4006a2:       75 05                   jne    4006a9 <test_likely(int)+0x9>
  4006a4:       e9 d7 ff ff ff          jmpq   400680 <f_likely()>
  4006a9:       e9 e2 ff ff ff          jmpq   400690 <f_unlikely()>
  4006ae:       66 90                   xchg   %ax,%ax

参考代码:

http://blog.csdn.net/cugxueyu/article/details/1955372

gnu cc扩展和ABI的更多相关文章

  1. GNU C 扩展(转)

    GNU CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,这些扩展对优化.目标代码布局.更安全的检查等方面提供了很强的支持.这里对支持支持 GNU 扩展的 C 语言成为 GN ...

  2. Linux 内核使用的 GNU C 扩展

    gcc核心扩展linuxforum(转)=========================== Linux 内核使用的 GNU C 扩展 =========================== GNC ...

  3. GNU C 扩展之__attribute__ 机制简介

    在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相关语法及 ...

  4. GNU GCC 扩展属性

    http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html constructor destructor constructor (prior ...

  5. 关于GNU规范的语法扩展

    GNU 是一款能用于构建类 Unix 操作系统的计算机软件合集,由自由软件之父 Richard Stallman 开创,于 1983 年 9 月 27 日对外发布.GNU 完全由自由软件(free s ...

  6. 了解甚少的GNU C的__attribute__ 机制

    平时忙着赶项目,很多东西都是不求甚解,当工作中遇到的一些比较刁钻的问题时,才发现自己和那些大牛的 差距---内功.熟练码农和码神的最大区别估计就是内功是否深厚了.在自我反思的过程中,也要逐渐的积累一些 ...

  7. GNU C编译器的gnu11和c11

    国际标准组织发布c11后,gnu为自己的编译器发布两种标准gnu11和c11 gnu11:带gnu c扩展的c11标准,如果你的代码包含了typeof,__attribute__等等gnu的扩展,就必 ...

  8. 【转载】 GNU GCC 选项说明

    GCC 1 Section: GNU Tools (1) Updated: 2003/12/05 Sponsor: GCC Casino Winning Content NAME gcc,g++-GN ...

  9. gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)

    总览 (SYNOPSIS) gcc [ option | filename ]... g++ [ option | filename ]... 警告 (WARNING) 本手册页 内容 摘自 GNU ...

随机推荐

  1. Appium移动自动化测试(二)--安装Android开发环境(转)

    Appium移动自动化测试(二)--安装Android开发环境 2015-06-04 17:30 by 虫师, 35299 阅读, 23 评论, 收藏, 编辑 继续Appium环境的搭建. 第二节   ...

  2. 使用Java Mail发送邮件

    本笔记参考自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/17839983 JavaMail是SUN提供给开发人员在应用程序中实现 ...

  3. sqlserver客户端连接只显示特定数据库的配置方法

    首先,在实例级,有一个 view any database的这个属性,打开时可以看到所有数据库的元数据表,因此能看到实例下所有数据库的名字.默认public角色拥有这个属性.所以新建的登陆是可以看到所 ...

  4. js dom操作获取节点的一些方法

    在复习javascript基础的时候,整理了一下js中获取节点的一些常用的方法,见代码: //js获取下一个兄弟节点 function getNextSibling(eleObj){ var next ...

  5. 分享一个linux和linux的文件传输【scp无密码传输】

    很多时候,本地测试服务器想把文件传到线上服务器的时候,很多人都是通过登陆线上服务器ssh 传输,这样挺危险的,很多弊端....所以我找了下方法,发现scp挺好用的! 模拟环境: 192.168.147 ...

  6. Bulk Insert 高效快速插入数据

    BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_nam ...

  7. C++发送邮件和附件

      c++socketnulldelete服务器stream 头文件 /**************************************************************** ...

  8. [转] prerender-SPA程序的SEO优化策略

    随着web2.0的兴起,ajax的时代已经成为了事实,更如今 Knockout,backbone, angular,ember前端MDV(model driver view)框架强势而来,Single ...

  9. 自定义控件(视图)2期笔记08:自定义控件之 9patch图说明

    1. 何为 9patch图 ?     它是一个对png图片做处理的一个工具,能够为我们生成一个"*.9.png"的图片:所谓"*.9.png"这是Androi ...

  10. Android中SQLite使用

    现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上 ...