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
- iOS可變引數(不定引數)的用法iOS
- Java不定長引數Java
- 不定引數的應用
- 【體系結構】Oracle引數介紹Oracle
- Oracle體系結構-引數檔案Oracle
- 結構體引數的傳遞以及如何修改指標引數的值結構體指標
- c# 方法引數_值引數C#
- c# 方法引數_引用引數C#
- c#方法引數_輸出引數C#
- c# 方法引數_陣列引數C#陣列
- C語言_結構體變數指標做函式引數的使用案例C語言結構體變數指標函式
- Python怎麼傳遞不定引數Python
- 使用反射對繫結url引數到結構體反射結構體
- C#中的值引數,引用引數及輸出引數C#
- 當儲存引數使用結構體時必備的開發技巧方式結構體
- C#引數傳遞之值引數C#
- 【Golang】建立有配置引數的結構體時,可選引數應該怎麼傳?Golang結構體
- python不定長引數如何呼叫函式?Python函式
- C語言結構體及函式傳遞陣列引數示例C語言結構體函式陣列
- InceptionResnetV1引數結構
- C#中命名引數和可選引數C#
- SOLIDWORKS軟體引數化建模配合技巧Solid
- kettle 引數——變數引數和常量引數變數
- 核心引數(轉)
- c# 方法引數(傳值,傳引用,ref,out,params,可選引數,命名引數)C#
- Metasploit設定LHOST引數技巧
- Metasploit設定VERBOSE引數技巧
- pandas引數設定小技巧
- Metasploit設定HttpTrace引數技巧HTTP
- Table 引數總結
- Oracle引數-隱藏引數Oracle
- C#陣列引數C#陣列
- c# {0}引數值C#
- C++預設引數C++
- 函式、引數、解構函式
- C++/C:數字轉成字串, 字串轉成數字C++字串
- parallel rollback引數總結Parallel