GCC-__attribute__()(一)属性机制
生活随笔
收集整理的這篇文章主要介紹了
GCC-__attribute__()(一)属性机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡介
__attribute__((option))是編譯器對C語言的擴展,可以設置特定的函數、變量和類型的相關屬性。
使用場景
主要用于優化代碼,保證編碼正確,優化程序邏輯,優化存儲格式等,正常簡單的項目都沒必要使用。
屬性列表(常用)
| constructor | F | 使被修飾的函數在main函數前被執行 | ? |
| destructor | F | 使被修飾的函數在main函數結束后被執行 | ? |
| format | F | 告訴編譯器,按照printf, scanf, strftime或strfmon的參數表格式規則對該函數的參數進行檢查 | ? |
| noreturn | F | 表示這個函數沒有返回值也不能有返回值 | |
| const | F | 表示一個方法的返回值只由參數決定,如果參數不變的話,就不再調用此函數,直接返回值 | ? |
| weak | F | 弱函數,如果同名函數在其他地方被定義將使用其他地方的函數,當其他地方沒有定義才使用該函數 | ? |
| warn_unused_result | F | 表明函數返回值必須被接收或使用,否則將編譯報錯 | 建議修飾所有返回動態內存地址和如果執行錯誤將導致后續流程執行并返回錯誤碼的函數 |
| cleanup() | V | 用于修飾變量,在變量作用域結束后調用指定函數 | ? |
| always_inline | F | 保證代碼是內聯的,強制內聯 | 不一定有效,具體還是得看編譯器 |
| section("name") | FV | 在編譯時將被修飾的函數或數據放入指定名為"name"對應的段中 | 需要修改鏈接腳本才能生效 |
| aligned(n) | VT | 格式化對齊,強制編譯器為結構體分配空間時采用規定位對齊,不指定數字時,編譯器自動選擇對目標機器最優方式 | ? |
| nothrow | F | 屬性告訴編譯器函數不能拋出異常(當代碼會被C++調用時才使用) | ? |
| packed | VT | 告訴編譯器取消結構在編譯過程中的優化對齊, 按照實際占用字節數進行對齊 | ? |
| pure | F | 函數除返回值外,不會通過其它(如全局變量、指針)對函數外部產生任何影響。 | ? |
| 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__()(一)属性机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 班级优化大师如何添加学生名单
- 下一篇: c语言学习加强营(一):switch分支