資源描述:
《gccattribute定義機(jī)制容易理解c頭文件》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、gccattribute機(jī)制GNUC的一大特色(卻不被初學(xué)者所知)就是__attribute__機(jī)制。__attribute__可以設(shè)置函數(shù)屬性(FunctionAttribute)、變量屬性(VariableAttribute)和類型屬性(TypeAttribute)。 __attribute__書寫特征是:__attribute__前后都有兩個下劃線,并切后面會緊跟一對原括弧,括弧里面是相應(yīng)的__attribute__參數(shù)?! _attribute__語法格式為: __attribute__((attribute-list)) 其位置約束為: 放于
2、聲明的尾部“;”之前。 函數(shù)屬性(FunctionAttribute) 函數(shù)屬性可以幫助開發(fā)者把一些特性添加到函數(shù)聲明中,從而可以使編譯器在錯誤檢查方面的功能更強(qiáng)大。__attribute__機(jī)制也很容易同非GNU應(yīng)用程序做到兼容之功效?! NUCC需要使用–Wall編譯器來擊活該功能,這是控制警告信息的一個很好的方式。下面介紹幾個常見的屬性參數(shù)。 __attribute__format 該__attribute__屬性可以給被聲明的函數(shù)加上類似printf或者scanf的特征,它可以使編譯器檢查函數(shù)聲明和函數(shù)實(shí)際調(diào)用參數(shù)之間的格式化字符串是否匹配。該
3、功能十分有用,尤其是處理一些很難發(fā)現(xiàn)的bug。 format的語法格式為: format(archetype,string-index,first-to-check) format屬性告訴編譯器,按照printf,scanf,strftime或strfmon的參數(shù)表格式規(guī)則對該函數(shù)的參數(shù)進(jìn)行檢查?!癮rchetype”指定是哪種風(fēng)格;“string-index”指定傳入函數(shù)的第幾個參數(shù)是格式化字符串;“first-to-check”指定從函數(shù)的第幾個參數(shù)開始按上述規(guī)則進(jìn)行檢查?! 【唧w使用格式如下: __attribute__((format(print
4、f,m,n))) __attribute__((format(scanf,m,n))) 其中參數(shù)m與n的含義為: m:第幾個參數(shù)為格式化字符串(formatstring); n:參數(shù)集合中的第一個,即參數(shù)“…”里的第一個參數(shù)在函數(shù)參數(shù)總數(shù)排在第幾,注意,有時函數(shù)參數(shù)里還有“隱身”的呢,后面會提到; 在使用上,__attribute__((format(printf,m,n)))是常用的,而另一種卻很少見到。下面舉例說明,其中myprint為自己定義的一個帶有可變參數(shù)的函數(shù),其功能類似于printf: //m=1;n=2 externvoidmypr
5、int(constchar*format,...)__attribute__((format(printf,1,2))); //m=2;n=3 externvoidmyprint(intl,constchar*format,...)__attribute__((format(printf,2,3))); 需要特別注意的是,如果myprint是一個函數(shù)的成員函數(shù),那么m和n的值可有點(diǎn)“懸乎”了,例如: //m=3;n=4 externvoidmyprint(intl,constchar*format,...)__attribute__((format(p
6、rintf,3,4))); 其原因是,類成員函數(shù)的第一個參數(shù)實(shí)際上一個“隱身”的“this”指針。(有點(diǎn)C++基礎(chǔ)的都知道點(diǎn)this指針,不知道你在這里還知道嗎?) 這里給出測試用例:attribute.c,代碼如下: 1: 2:externvoidmyprint(constchar*format,...)__attribute__((format(printf,1,2))); 3: 4:voidtest() 5:{ 6:myprint("i=%d",6); 7:myprint("i=%s",6); 8:myprint("i=%s
7、","abc"); 9:myprint("%s,%d,%d",1,2); 10:} 運(yùn)行$gcc–Wall–cattribute.cattribute后,輸出結(jié)果為: attribute.c:Infunction`test': attribute.c:7:warning:formatargumentisnotapointer(arg2) attribute.c:9:warning:formatargumentisnotapointer(arg2) attribute.c:9:warning:toofewargumentsforforma
8、t 如果在attr