GNU C中的__attribute__機制簡介

來源:互聯網
上載者:User

1. __attribute__

GNU C的一大特色(卻不被初學者所知)就是 __attribute__機制。

__attribute__可以設定函數屬性(Function Attribute)、變數屬性(Variable Attribute)和類型屬性(Type Attribute)

__attribute__前後都有兩個底線,並且後面會緊跟一對原括弧,括弧 裡面是相應的__attribute__參數

__attribute__文法格式為:

__attribute__ ( ( attribute-list ) )

函數屬性(Function Attribute),函數屬性可以協助開發人員把一些特性添加到函式宣告中,從而可以 使編譯器在錯誤檢查方面的功能更強大。

__attribute__機制也很容易同 非GNU應用程式做到相容。

GNU CC需要使用 –Wall,這是控制警告資訊的 一個很好的方式。下面介紹幾個常見的屬性參數。

2. format

該屬 性可以使編譯器檢查函式宣告和函數實際調用參數之間的格式化字串是否匹配 。它可以給被聲明的函數加上類似printf或者scanf的特徵,該功能十分有用,尤 其是處理一些很難發現的bug。

format的文法格式為:

format ( archetype,  string-index,  first-to-check )

format屬性 告訴編譯器,按照printf,scanf,strftime或strfmon的參數表格式規則對該函 數的參數進行檢查。archetype:指定是哪種風格;

string-index:指定 傳入函數的第幾個參數是格式化字串;

first-to-check:指定從函數的 第幾個參數開始按上述規則進行檢查。

具體使用格式如下:

__attribute__( ( format( printf,m,n ) ) )

__attribute__( ( format( scanf,m,n ) ) )

其中參數m與n的含義為:

m:第幾 個參數為格式化字串(format string);

n:參數集合中的第一個,即 參數“…”裡的第一個參數在函數參數總數排在第幾

注意,有時函數參數 裡還有“隱藏”的呢,後面會提到;

在使用上,__attribute__((format (printf,m,n)))是常用的,而另一種卻很少見到。

下面舉例說明,其中 myprint為自己定義的一個帶有可變參數的函數,其功能類似於printf:

//m=1;n=2

extern void  myprint( const char *format, … ) __attribute__( ( format( printf,1,2 ) ) );

//m=2; n=3

extern void  myprint( int l,const char *format,... ) __attribute__( ( format( printf,2,3 ) ) );

需要特別注意的是,如 果myprint是一個函數的成員函數,那麼m和n的值可有點“懸乎”了,例如:

//m=3;n=4

extern void  myprint( int l,const char *format,... ) __attribute__( ( format( printf,3,4 ) ) );

其原 因是,類成員函數的第一個參數實際上一個“隱藏”的“this”指標。(有點C++ 基礎的都知道點this指標,不知道你在這裡還知道嗎?)
這裡給出測試用 例:attribute.c,代碼如下:

extern void myprint(const char *format,...) __attribute__((format(printf,1,2)));

void test()

{

        myprint("i=% d/n",6);

        myprint("i=% s/n",6);

        myprint("i=% s/n","abc");

       myprint ("%s,%d,%d/n",1,2);

}

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。