C语言 __VA_ARGS__ - C语言零基础入门教程
目錄
- 一.__VA_ARGS__簡(jiǎn)介
- 二.__VA_ARGS__使用
- 1.__VA_ARGS__宏輸出字符串常量
- 2.__VA_ARGS__宏輸出可變參數(shù)
- 三.__VA_ARGS__缺點(diǎn)
- 1.僅僅只支持字符串常量,不支持可變參數(shù)
- 2.僅僅只支持可變參數(shù),不支持字符串常量
- 四.猜你喜歡
零基礎(chǔ) C/C++ 學(xué)習(xí)路線推薦 : C/C++ 學(xué)習(xí)目錄 >> C 語(yǔ)言基礎(chǔ)入門
一.__VA_ARGS__簡(jiǎn)介
__VA_ARGS__ 是一個(gè)可變參數(shù)的宏,是新的 C99 規(guī)范中新增的,目前似乎只有 gcc 支持( VC 從 VC2005 開(kāi)始支持)。
[__VA_ARGS__](https://www.codersrc.com/archives/9450.html)需要配合 define 使用,總體來(lái)說(shuō)就是將左邊宏中 .. 的內(nèi)容原樣抄寫(xiě)在右邊 __VA_ARGS__ 所在的位置; 舉個(gè)例子:
#define myprintf(...) printf( __VA_ARGS__)示例代碼如下:
/******************************************************************************************/ //@Author:猿說(shuō)編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語(yǔ)言教程 - C語(yǔ)言 __VA_ARGS__ //@Time:2021/07/10 08:00 //@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/#include <stdio.h>#define myprintf(...) printf( __VA_ARGS__)int main() {myprintf("0123456789\n");myprintf("www.codersrc.com\n");myprintf("C語(yǔ)言/C++教程-猿說(shuō)編程\n");return 0; }/* 0123456789 www.codersrc.com C語(yǔ)言/C++教程-猿說(shuō)編程 */注意:[__VA_ARGS__](https://www.codersrc.com/archives/9450.html) 只能是一些不含任何變量的字符串常量。如果 __VA_ARGS__ 含有變量,整個(gè) printf 的輸出與變量便不能一一對(duì)應(yīng),輸出會(huì)出錯(cuò)。
二.__VA_ARGS__使用
__DATE__ 當(dāng)前日期,一個(gè)以 “MMM DD YYYY” 格式表示的字符串常量。
__TIME__ 當(dāng)前時(shí)間,一個(gè)以 “HH:MM:SS” 格式表示的字符串常量。
__FILE__ 這會(huì)包含當(dāng)前文件名,一個(gè)字符串常量。
__LINE__ 這會(huì)包含當(dāng)前行號(hào),一個(gè)十進(jìn)制常量。
__STDC__ 當(dāng)編譯器以 ANSI 標(biāo)準(zhǔn)編譯時(shí),則定義為 1;判斷該文件是不是標(biāo)準(zhǔn) C 程序。
__FUNCTION__ 程序預(yù)編譯時(shí)預(yù)編譯器將用所在的函數(shù)名,返回值是字符串;
1.__VA_ARGS__宏輸出字符串常量
/******************************************************************************************/ //@Author:猿說(shuō)編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語(yǔ)言教程 - C語(yǔ)言 __VA_ARGS__ //@Time:2021/07/10 08:00 //@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/#include <stdio.h>#define LOGFUNC(...) (printf(__VA_ARGS__" - %d - %s/%s\n",__LINE__,__TIME__,__DATE__))int main() {LOGFUNC("0123456789");LOGFUNC("www.codersrc.com");LOGFUNC("C語(yǔ)言/C++教程-猿說(shuō)編程");return 0; }/* 0123456789 - 9 - 07:52:40/Jul 11 2021 www.codersrc.com - 10 - 07:52:40/Jul 11 2021 C語(yǔ)言/C++教程-猿說(shuō)編程 - 11 - 07:52:40/Jul 11 2021 */缺點(diǎn):
2.__VA_ARGS__宏輸出可變參數(shù)
/******************************************************************************************/ //@Author:猿說(shuō)編程 //@Blog(個(gè)人博客地址): www.codersrc.com //@File:C語(yǔ)言教程 - C語(yǔ)言 __VA_ARGS__ //@Time:2021/07/10 08:00 //@Motto:不積跬步無(wú)以至千里,不積小流無(wú)以成江海,程序人生的精彩需要堅(jiān)持不懈地積累! /******************************************************************************************/#include <stdio.h>#define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)int main() {//輸出可變參數(shù)LOGSTRINGS("0123456789,%d%s",1,"sd"); //OK//輸出字符串常量報(bào)錯(cuò)//LOGSTRINGS("C語(yǔ)言/C++教程-猿說(shuō)編程");/*LOGSTRINGS("C語(yǔ)言/C++教程-猿說(shuō)編程");報(bào)錯(cuò)如下:main.cpp: In function ‘int main()’: main.cpp: error: expected primary-expression before ‘)’ token3 | #define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)*/return 0; }/* 0123456789,1sd */三.__VA_ARGS__缺點(diǎn)
1.僅僅只支持字符串常量,不支持可變參數(shù)
#define LOGFUNC(...) (printf(__VA_ARGS__))2.僅僅只支持可變參數(shù),不支持字符串常量
#define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)那么如何才能解決 __VA_ARGS__ 既能支持常規(guī)字符串也能支持可變參數(shù)問(wèn)題,我們可以留到下一篇文章通過(guò) [##__VA_ARGS__](https://www.codersrc.com/archives/9480.html) 實(shí)現(xiàn)!
四.猜你喜歡
未經(jīng)允許不得轉(zhuǎn)載:猿說(shuō)編程 ? C 語(yǔ)言 __VA_ARGS__
總結(jié)
以上是生活随笔為你收集整理的C语言 __VA_ARGS__ - C语言零基础入门教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: BugkuCTF-WEB题秋名山车
- 下一篇: BugkuCTF-MISC题cisco(