C技巧:結構體引數轉成不定引數

freebus發表於2020-03-17

下面這段程式是一個C語言的小技巧,其展示瞭如何把一個引數為結構體的函式轉成一個可變引數的函式,其中用到了宏和內建宏“__VA_ARGS__”,下面這段程式可以在GCC下正常編譯透過:



1#include <stdio.h>

2

3#define func(...) myfunc((struct mystru){__VA_ARGS__})

5struct mystru { const char *name; int number; };

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章