⑴ 前面聲明過va_list ap;後面出現了va_start (ap, fmt),va_arg (ap, int)。fmt 和 int 是什麼參數啊
給個例子自己看:
四個重要的宏: va_list va_start va_arg va_end
va_list 定義了參數列表
va_start 指定列表開始的參數
va_arg 取出列表中的參數, 順序為函數傳遞參數順序(從左到右)
va_end 參數列表結束
舉例:
#include <iostream>
#include <stdarg.h>
using namespace std;
int add(int totalnum...)//totalnum指定了參數的個數,...表示參數不定, 為定義此類函數必需
{
va_list intlist;//定義參數表 intlist
va_start(intlist, totalnum);//指定開始參數為totalnum
int totaladd = 0;
for(int i=0;i<totalnum;i++)
{
totaladd += va_arg(intlist,int);//取出參數類型為int的參數 你說的fmt是參數的類型如float等
}
va_end(intlist);//參數取完
return totaladd;
}
void main()
{
cout<<add(5,1,2,3,4,5)<<endl;
}
答案為15
⑵ #define PDEBUG(fmt,args...) fprintf(stderr,fmt, ## args)
標准C只支持可變參數的函數,意味著函數的參數是不固定的,例如printf()函數
的原型為:
int printf( const char *format [, argument]... );
而在GNU C中,宏也可以接受可變數目的參數,例如:
#define pr_debug(fmt,arg...) \
printk(fmt,##arg)
這里arg 表示其餘的參數可以是零個或多個,這些參數以及參數之間的逗號構成
arg 的值,在宏擴展時替換arg,例如下列代碼:
pr_debug("%s:%d",filename,line)
會被擴展為:
printk("%s:%d", filename, line)
⑶ C 語言怎麼判斷傳入數據的類型
通過約定參數類型或者約定參數格式,確定傳入數據的類型。
1、 大多數情況下,參數類型都是確定的,在函數定義時就可以確定類型。此種情況下,不需要函數本身判斷,編譯器會做判斷或轉換。
如
voidfunc(intn);
聲明這樣的函數,參數為int型,當調用時如果實參不是int型,C編譯器會嘗試轉換為int型,如果轉換失敗,則編譯報錯。
2、 對於參數個數和類型不確定的情況,也就是不定參數形式,一般增加一個格式字元串,通過格式字元串解析後續有幾個參數,每個類型是什麼。
典型例子為printf:
intprintf(constchar*fmt,...);
在printf中,後續參數類型及個數都是不確定的,printf會根據參數fmt中包含的格式字元串,來確定後續的參數類型。 比如傳入fmt為"%s%d%lu",那麼printf就會嘗試在後續參數中讀取三個值,類型分別為char *, int,和unsigned long。
除此外,也可以採用其他方式進行約定。
⑷ 關於gcc的__attribute__的一個疑問
__attribute__ format
該__attribute__屬性可以給被聲明的函數加上類似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,代碼如下:
1:
2:extern void myprint(const char *format,...) __attribute__((format(printf,1,2)));
3:
4:void test()
5:{
6: myprint("i=%d\n",6);
7: myprint("i=%s\n",6);
8: myprint("i=%s\n","abc");
9: myprint("%s,%d,%d\n",1,2);
10:}
運行$gcc –Wall –c attribute.c attribute後,輸出結果為:
attribute.c: In function `test':
attribute.c:7: warning: format argument is not a pointer (arg 2)
attribute.c:9: warning: format argument is not a pointer (arg 2)
attribute.c:9: warning: too few arguments for format
如果在attribute.c中的函數聲明去掉__attribute__((format(printf,1,2))),再重新編譯,既運行$gcc –Wall –c attribute.c attribute後,則並不會輸出任何警告信息。 注意,默認情況下,編譯器是能識別類似printf的"標准」庫函數。
⑸ c語言如何按照日期區間輸出
函數按照參數fmt所設定格式將time類型的參數格式化為日期時間信息。
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。
C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言,盡管C語言提供了許多低級處理的功能,但仍然保持著跨平台的特性,以一個標准規格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業平台的許多計算機平台上進行編譯。
C語言發展歷史。
C語言是一門面向過程的計算機編程語言,與C++、C、Java等面向對象編程語言有所不同。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、僅產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
當前階段,在編程領域中,C語言的運用非常之多,它兼顧了高級語言和匯編語言的優點,相較於其它編程語言具有較大優勢,計算機系統設計以及應用程序編寫是C語言應用的兩大領域。
⑹ A = imread(filename,fmt) [X,map] = imread(filename,fmt) 區別
首先你問錯地方了,應該在matlab里問這個問題。還是給你解釋下把,其實他們之間沒什麼區別都是對圖片進行讀取,參數不一樣罷了。A = imread(filename,fmt) ,其作用是將文件名用字元串filename表示的,擴展名用fmt表示的圖像文件中的數據讀到矩陣A中。如果filename所指的為灰度級圖像,則A為一個二維矩陣;如果filename所指的為RGB圖像,則A為一個m×n×3的三維矩陣。當你要圖片顯示的話,就用imshow(A)就行了。[X,map] = imread(filename,fmt)就是把文件filename讀取到X的map向量中,如果要圖片顯示,imshow(X.map)就可以了。
總而言之,其實就是一個imread的不同表達方式,根據你的習慣採用哪一種
⑺ C語言可變參數傳遞的問題
voidfun1(inta,intb,constchar*fmt,...);
voidfun2(constchar*fmt,...);.
你注意了,參數傳遞的可是const類型的,不可以改變哦~
傳遞出來的args當然也不會有變化。
(奇怪的是你的編譯器沒有報錯嗎?暈啊……)
⑻ C語言中的fmt是什麼
DEFINE 巨集定義
所給之定義中的fmt, 是一個暫時符號, 用來表示需要代換的參數.
在PC_Usart中, 依照 符號"," 進行分隔; 對照使用端範例, 即用來代替 "%s" 這個欄位.
實際上巨集的fmt, 可以看做一個欄位的代稱, 用來表示一個欄位的名稱, 並非只能使用"%s".