目錄
- 一.__VA_ARGS__簡介
- 二.__VA_ARGS__使用
- 1.__VA_ARGS__宏輸出字串常量
- 2.__VA_ARGS__宏輸出可變引數
- 三.__VA_ARGS__缺點
- 1.僅僅只支持字串常量,不支持可變引數
- 2.僅僅只支持可變引數,不支持字串常量
- 四.猜你喜歡
零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門
一.__VA_ARGS__簡介
__VA_ARGS__ 是一個可變引數的宏,是新的 C99 規范中新增的,目前似乎只有 gcc 支持( VC 從 VC2005 開始支持),
[__VA_ARGS__](https://www.codersrc.com/archives/9450.html)需要配合 define 使用,總體來說就是將左邊宏中 .. 的內容原樣抄寫在右邊 __VA_ARGS__ 所在的位置; 舉個例子:
#define myprintf(...) printf( __VA_ARGS__)
示例代碼如下:
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 __VA_ARGS__
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#include <stdio.h>
#define myprintf(...) printf( __VA_ARGS__)
int main()
{
myprintf("0123456789\n");
myprintf("www.codersrc.com\n");
myprintf("C語言/C++教程-猿說編程\n");
return 0;
}
/*
0123456789
www.codersrc.com
C語言/C++教程-猿說編程
*/
注意:[__VA_ARGS__](https://www.codersrc.com/archives/9450.html) 只能是一些不含任何變數的字串常量,如果 __VA_ARGS__ 含有變數,整個 printf 的輸出與變數便不能一一對應,輸出會出錯,
二.__VA_ARGS__使用
__DATE__ 當前日期,一個以 “MMM DD YYYY” 格式表示的字串常量,
__TIME__ 當前時間,一個以 “HH:MM:SS” 格式表示的字串常量,
__FILE__ 這會包含當前檔案名,一個字串常量,
__LINE__ 這會包含當前行號,一個十進制常量,
__STDC__ 當編譯器以 ANSI 標準編譯時,則定義為 1;判斷該檔案是不是標準 C 程式,
__FUNCTION__ 程式預編譯時預編譯器將用所在的函式名,回傳值是字串;
1.__VA_ARGS__宏輸出字串常量
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 __VA_ARGS__
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#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語言/C++教程-猿說編程");
return 0;
}
/*
0123456789 - 9 - 07:52:40/Jul 11 2021
www.codersrc.com - 10 - 07:52:40/Jul 11 2021
C語言/C++教程-猿說編程 - 11 - 07:52:40/Jul 11 2021
*/
缺點:
-
只支持字串,不支持可變引數或者多個引數;
[__VA_ARGS__](https://www.codersrc.com/archives/9450.html)只能是一些不含任何變數的字串常量, -
如果
__VA_ARGS__含有變數,整個printf輸出與變數便不能一一對應,輸出會出錯;/**********/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C 語言教程 - C 語言 VA_ARGS
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/**********/#include <stdio.h> #define LOGFUNC(...) (printf(**VA_ARGS**" - %d - %s/%s\n",**LINE**,**TIME**,**DATE**)) int main() { LOGFUNC("0123456789");//OK //錯誤寫法:只支持字串,不支持可變引數或者多個引數 LOGFUNC("%d,%d",1,2); //編譯報錯 return 0; } /\* main.cpp: In function ‘int main()’: main.cpp: error: expected ‘)’ before string constant 4 | #define LOGFUNC(...) (printf(**VA_ARGS**" - %d - %s/%s\n",**LINE**,**TIME**,**DATE**)) \*/
2.__VA_ARGS__宏輸出可變引數
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 __VA_ARGS__
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
#include <stdio.h>
#define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)
int main()
{
//輸出可變引數
LOGSTRINGS("0123456789,%d%s",1,"sd"); //OK
//輸出字串常量報錯
//LOGSTRINGS("C語言/C++教程-猿說編程");
/*LOGSTRINGS("C語言/C++教程-猿說編程");報錯如下:
main.cpp: In function ‘int main()’:
main.cpp: error: expected primary-expression before ‘)’ token
3 | #define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)
*/
return 0;
}
/*
0123456789,1sd
*/
三.__VA_ARGS__缺點
1.僅僅只支持字串常量,不支持可變引數
#define LOGFUNC(...) (printf(__VA_ARGS__))
2.僅僅只支持可變引數,不支持字串常量
#define LOGSTRINGS(fm, ...) printf(fm,__VA_ARGS__)
那么如何才能解決 __VA_ARGS__ 既能支持常規字串也能支持可變引數問題,我們可以留到下一篇文章通過 ##VA_ARGS 實作!
四.猜你喜歡
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 指標宣告和定義
- C 語言 指標 p++ / p–
- C 語言 p++/§++/_(p++)/_p++
- C 語言 使用指標遍歷陣列
- C 語言 指標和陣列區別
- C 語言 指標陣列和陣列指標區別
- C 語言 空指標 NULL
- C 語言 void 指標
- C 語言 野指標
- C 語言 函式值傳遞和址傳遞
- C 語言 函式預設引數
- C 語言 函式不定長引數
- C 語言 函式指標
- C 語言 指標函式
- C 語言 回呼函式 callback
- C 語言 typedef
- C 語言 define 定義常量
- C 語言 define 防止頭檔案重復包含
- C 語言 #pragma once
- C 語言 #include <> 與 #include “” 區別
- C 語言 const 修飾變數
- C 語言 const 修飾指標
- C語言 const 修飾函式
- C 語言 const 修飾函式引數
- C 語言 const 和 define 區別
- C 語言 #運算子
- C 語言 ##運算子
- C 語言 __VA_ARGS__
未經允許不得轉載:猿說編程 ? C 語言 __VA_ARGS__
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/300369.html
標籤:其他
