日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言 __VA_ARGS__ - C语言零基础入门教程

發布時間:2024/9/27 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言 __VA_ARGS__ - C语言零基础入门教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一.__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 constant4 | #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 ‘)’ token3 | #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__](https://www.codersrc.com/archives/9480.html) 實現!

    四.猜你喜歡

  • 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__

    總結

    以上是生活随笔為你收集整理的C语言 __VA_ARGS__ - C语言零基础入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。