C技巧:結構體引數轉成不定引數
下面這段程式是一個C語言的小技巧,其展示瞭如何把一個引數為結構體的函式轉成一個可變引數的函式,其中用到了宏和內建宏“__VA_ARGS__”,下面這段程式可以在GCC下正常編譯透過:
1#include <stdio.h>
2
3#define func(...) myfunc((struct mystru){__VA_ARGS__})
4
5struct mystru { const char *name; int number; };
6
7void myfunc(struct mystru ms )
8{
9 printf("%s: %d\n", ms.name ?: "untitled", ms.number);
10}
11
12int main(int argc, char **argv)
13{
14 func("three", 3);
15 func("hello");
16 func(.name = "zero");
17 func(.number = argc, .name = "argc",);
18 func(.number = 42);
19 return 0;
20}
從上面這段程式,我們可以看到一個叫 myfunc的函式,被func的宏改變了,本來myfunc需要的是一個叫mystru的結構,然而透過宏,我們把struct mystru的這個引數,變成了不定引數列表的一個函式。上面這段程式輸出入下,
three: 3
hello: 0
zero: 0
argc: 1
untitled: 42
雖然,這樣的用法並不好,但是你可以從另外一個方面瞭解一下這世上對C稀奇古怪的用法。 如果你把宏展開後,你就明的為什麼了。下面是宏展開的樣子:
1myfunc((struct mystru){"three", 3});
2myfunc((struct mystru){"hello"});
3myfunc((struct mystru){.name = "zero"});
4myfunc((struct mystru){.number = argc, .name = "argc",});
5myfunc((struct mystru){.number = 42});
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31365439/viewspace-2680878/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java不定長引數Java
- Ruby方法傳不定引數
- Python怎麼傳遞不定引數Python
- InceptionResnetV1引數結構
- python不定長引數如何呼叫函式?Python函式
- 當儲存引數使用結構體時必備的開發技巧方式結構體
- SOLIDWORKS軟體引數化建模配合技巧Solid
- 【Golang】建立有配置引數的結構體時,可選引數應該怎麼傳?Golang結構體
- python json格式轉url引數&分割, url引數轉json格式PythonJSON
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- 在 Lua 中使用引數技巧
- pandas引數設定小技巧
- Metasploit設定VERBOSE引數技巧
- Metasploit設定HttpTrace引數技巧HTTP
- Metasploit設定LHOST引數技巧
- SpringMVC的引數繫結-日期格式轉換SpringMVC
- C++預設引數C++
- Spring Boot 引數轉換Spring Boot
- 函式、引數、解構函式
- 什麼是請求引數、表單引數、url引數、header引數、Cookie引數?一文講懂HeaderCookie
- parallel rollback引數總結Parallel
- C++型別引數化C++型別
- c++可變模板引數C++
- URL引數獲取/轉碼
- python疑問5:位置引數,預設引數,可變引數,關鍵字引數,命名關鍵字引數區別Python
- c#基礎-5.變長引數和引數預設值C#
- Flask開發技巧之引數校驗Flask
- Mybatis引數處理總結MyBatis
- Grails中如何繫結引數AI
- Python函式引數總結Python函式
- C/C++多引數函式引數的計算順序與壓棧順序C++函式
- C++逆向 可變引數HookC++Hook
- C++引數的傳遞方式C++
- C++11 可變引數模板C++
- C#獲取URL引數值C#
- 12.MyBatis學習--對映檔案_引數處理_單個引數&多個引數&命名引數MyBatis
- Java對比有引數和無引數Java
- Go專案實戰—引數繫結,型別轉換Go型別