日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GCC-__attribute__()(一)属性机制

發布時間:2023/12/2 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GCC-__attribute__()(一)属性机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介


__attribute__((option))是編譯器對C語言的擴展,可以設置特定的函數、變量和類型的相關屬性。

使用場景


主要用于優化代碼,保證編碼正確,優化程序邏輯,優化存儲格式等,正常簡單的項目都沒必要使用。

屬性列表(常用)


屬性名稱作用域
(F:函數, V: 變量,T: 類型)含義備注
constructorF使被修飾的函數在main函數前被執行?
destructorF使被修飾的函數在main函數結束后被執行?
formatF告訴編譯器,按照printf, scanf, strftime或strfmon的參數表格式規則對該函數的參數進行檢查?
noreturnF表示這個函數沒有返回值也不能有返回值
constF表示一個方法的返回值只由參數決定,如果參數不變的話,就不再調用此函數,直接返回值?
weakF弱函數,如果同名函數在其他地方被定義將使用其他地方的函數,當其他地方沒有定義才使用該函數?
warn_unused_resultF表明函數返回值必須被接收或使用,否則將編譯報錯建議修飾所有返回動態內存地址和如果執行錯誤將導致后續流程執行并返回錯誤碼的函數
cleanup()V用于修飾變量,在變量作用域結束后調用指定函數?
always_inlineF保證代碼是內聯的,強制內聯不一定有效,具體還是得看編譯器
section("name")FV在編譯時將被修飾的函數或數據放入指定名為"name"對應的段中需要修改鏈接腳本才能生效
aligned(n)VT格式化對齊,強制編譯器為結構體分配空間時采用規定位對齊,不指定數字時,編譯器自動選擇對目標機器最優方式?
nothrowF屬性告訴編譯器函數不能拋出異常(當代碼會被C++調用時才使用)?
packedVT告訴編譯器取消結構在編譯過程中的優化對齊, 按照實際占用字節數進行對齊?
pureF函數除返回值外,不會通過其它(如全局變量、指針)對函數外部產生任何影響。?
nonull(n)‘F’函數第n個參數不能為NULL多個參數時使用逗號隔開

如果不確定屬性是否支持或存在,可以使用關鍵宏__has_attribute,進行判定。

#ifndef __has_attribute /*!< 判斷一下是否支持 __has_attribute */ #warning Unsupport __has_attribute #define __has_attribute(x) 0 #endif #if __has_attribute(visibility) /*!< 判斷一下是否支持 visibility*/ #define ATTR_EXTERNAL_API __attribute__((visibility("default"))) #define ATTR_LOCAL_API __attribute__((visibility("hidden"))) #else #error Unsupport visibility. #endif

使用格式


標準的使用位置是放置在聲明的尾部的;之前。
多個屬性使用,隔開,如int hello(void) __attribute__((noreturn,constructor));

使用示例

#include <stdio.h> /*** @brief 定義一個函數init,使用屬性`constructor`修飾,使該函數在main函數執行前執行.*/ static void init(void) __attribute__((constructor)); /*** @brief 定義一個函數deinit,使用屬性`constructor`修飾,使該函數在main函數執行后執行.*/ static void deinit(void) __attribute__((destructor));int main(int argc, char **argv) {printf("main\n");return 0; }static void init(void) {printf("init\n"); }static void deinit(void) {printf("deinit\n"); }

然后正常編譯(ubuntu 16.04x64)

gcc -o test test.c

執行程序:

root@seven: ~/projects/test# ./test init main deinit root@seven: ~/projects/test#

函數init在main之前執行,函數deinit在main之后執行。

總結

以上是生活随笔為你收集整理的GCC-__attribute__()(一)属性机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。