C 语言的 GCC 扩展
GNU 编译器(GCC)提供了很多 C 语言扩展,编译器会使用该信息生成更高效的机器代码。
内联函数
static inline __attribute__ ((always_inline)) int foo(void) { /* ... */ }
避免内联
__attribute__ ((noinline)) int foo(void) { /*...*/ }
纯函数
__attribute__ ((pure)) int foo(int val) { /* */ }
返回值只受函数参数或 nonvolatile 全局变量影响。
常函数
__attribute__ ((const)) int foo(int val) { /*...*/ }
常函数是一种严格的纯函数。常函数不能访问全局变量,参数不能是指针类型。因此,常函数的返回值只和值传递的参数值有关。
没有返回值的函数
__attribute__ ((noreturn)) void foo(int val) { /*...*/ }
分配内存的函数
__attribute__ ((malloc)) void *copy()
{
int size = ;
return malloc();
}
强制调用方检查返回值
#include <stdio.h> __attribute__ ((warn_unused_result)) int foo()
{
return ;
} int main()
{
foo();
return ;
}
把函数标识为“Deprecated(已废弃)”
__attribute__ ((deprecated)) void foo(void) { /*...*/ }
把函数标识为已使用
static __attribute__ ((used)) void foo(void) { /*...*/ }
把函数或参数标识为未使用的
int foo(int __attribute__ ((unused)) value) { /*...*/}
对结构体进行紧凑存储(pack)
struct __attribute__ ((packed)) foo { ... };
packed 属性告诉编译器一个类型或变量应该在内存中紧凑存储,使用尽可能少的空间,可能不依赖对齐需求。如果在结构体(struct)或联合体(union)上指定该属性,就需要对所有变量进行紧凑存储。如果只是对某个变量指定该属性,就只会紧凑存储该特定变量。
C 语言的 GCC 扩展的更多相关文章
- GCC扩展(转--对看kernel代码有帮助
http://my.oschina.net/senmole/blog?catalog=153878 Linux Kernel的代码,上次就发现一个结构体的定义形式看不懂,后来才知道它用的不是标准的AN ...
- 【Go语言】面向对象扩展——接口
简单地说 Interface是一组Method的组合,可以通过Interface来定义对象的一组行为.如果某个对象实现了某个接口的所有方法,就表示它实现了该借口,无需显式地在该类型上添加接口说明. I ...
- linux内核宏container_of前期准备之gcc扩展关键字typeof
typeof基本介绍 typeof(x) 这是它的使用方法,x可以是数据类型或者表达式.它的作用时期和sizeof类似,就是它是在编译器从高级语言(如C语言)翻译成汇编语言时起作用,这个很重要,稍后会 ...
- XML语言:可扩展的标记语言;
作用:1. 解决跨语言的数据交换,C#与Javascript 语言的数据交换:. 2.XML:用于数据的存储以及传输:1.新建方法: 在解决方案资源管理器----选中网站名---右击添加新建项---- ...
- GCC扩展 __attribute__ ((visibility("hidden")))
试想这样的情景,程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢? 这取决于链接时的顺序,比如先链 ...
- Notepad++编译和运行C语言 (GCC)
我们在学习C语言的时候,实际上只需要编译器和编辑器就能开搞了.(初学者过早接触IDE不利于理解程序构建的过程) 在看这篇文章的时候,假设你已经知道如何把GCC配置到环境变量,并且会在命令行/终端下使用 ...
- 使用C语言开发PHP扩展(转)
本篇文章给大家带来的内容是介绍如何使用C语言给PHP写扩展,,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.在php源码路径的ext文件夹下,新建一个extend_test.de ...
- Swift语言精要 - 扩展(Extension)
swift的Extension用户在不访问代码的情况下扩展基本结构类型或自定义类 extension Int { var doubled : Int { } func multiplyWith(ano ...
- MinGW配置C语言编译器gcc和g++
首先,在 https://sourceforge.net/projects/mingw/files/latest/download 下载安装MinGW,如下图所示: 点Installation-> ...
随机推荐
- 026_nginx引用lua遇到的坑
server { listen 80; listen 443 ssl; server_name www.jyall.com; access_log /data/log/nginx/*.www.jyal ...
- ubuntu 安装 wireshark
1.添加 wireshark 源 sudo apt-add-repository ppa:wireshark-dev/stable 2.更新 sudo apt-get update 3.安装 w ...
- nginx或者squid正向代理实现受限网站的访问
项目背景:公司商务同事需要操作合作方的后台,但是这个后台做了限制(安全考虑只对指定IP放行),刚好公司是adsl拨号,经常更换IP 需求:让商务同事不要经常给IP到合作方去添加白名单 于是想到了做正向 ...
- Select查询命令
一开始SELECT查询的命令为 SELECT * FROM employee; SELECT 要查询的列名 FROM 表名字 WHERE 限制条件; 若要查询所有内容,就用*代 ...
- unit test
1) State vs Behaviour Verificationhttps://manas.tech/blog/2009/04/30/state-vs-behaviour-verification ...
- 【原创】大叔经验分享(41)hdfs开启kerberos之后报错Encryption type AES256 CTS mode with HMAC SHA1-96 is not supported/enabled
hdfs开启kerberos之后,namenode报错,连不上journalnode 2019-03-15 18:54:46,504 WARN org.apache.hadoop.security.U ...
- LuoGu P2735 电网 Electric Fences
题目传送门 这个东西,本来我是用求出两条一次函数解析式然后判断在x坐标下的y坐标值来做的 首先因为没考虑钝角三角形,WA了 然后又因为精度处理不好又WA了 一气之下,只能去网上查了查那个皮克定理 首先 ...
- Confluence 6 查看系统属性
当你添加了内存,设置了代理(proxy)或者修改了 Java 的选项,通常比较难判断系统是否已经按照你的修改进行了配置和启动.这个页面将会帮助你查看 Confluence 站点运行使用的系统属性. 你 ...
- windows下如何安装pip以及如何查看pip是否已经安装成功
最近刚学习python,发现很多关于安装以及查看pip是否安装成的例子都比较老,不太适合于现在(python 3.6 )因此,下一个入门级别的教程. 0:首先如何安装python我就不做介绍了. 1: ...
- C++标准库和标准模板库(转)
转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标 ...