2011-09-26 24 views
1

據我所知,有沒有辦法在Ç打印出一個結構值。是否有一個C預處理器宏來打印出結構?

即,這不飛:

typedef struct { 
    int a; 
    double b; 
} stype 

stype a; 

a.a=3; 
a.b=3.4; 

printf("%z", a); 

,而不是你不得不說:

printf("a: %d\n", a.a); 
printf("b: %f\n", a.b); 

這似乎是在那裏你可以使用宏來節省了大量的好地方打字任意結構。

是在Ç預處理器強大到足以進行這種轉變?

回答

3

我認爲,最簡單的解決辦法(也許最美麗)是使用功能打印您的具體結構。

void display_stype(stype *s) 
{ 
    printf("a: %d\n", s->a); 
    printf("b: %f\n", s->b); 
} 

如果你的結構改變了,你可以在一個地方你的代碼輕鬆適應。

+0

這可能是最好的答案。我想知道是否有可能創建一個既能定義結構又能顯示功能的宏。我會考慮這一點(我對C宏不太好),如果沒有人讓我知道它,我自己發佈一個答案。 –

2

不,C預處理主要是文本宏替換工具。它不知道C的類型和結構。

3

C預處理器是否足夠強大以執行此轉換?

是的,但是,然後你必須重複宏內的整個結構聲明,這種類型的目的是失敗的。你可能有這樣的事情:

STRUCT_PRINTF(
    a 
    , (int, a) 
    (double, b) 
); 

,然後你需要一個相當複雜的執行這樣的宏,用很多很多的輔助宏/功能。

1

不能在結構成員迭代在C,動態地或靜態(也沒有在C++)。有一個在C.

沒有任何反映。因此,有沒有辦法讓預處理器進行這種轉變。

+0

只是一個挑逗,雖然技術上是真的,但我認爲術語「反射」特指在運行時,而預處理器在編譯時工作。所以一種語言可以支持編譯時結構迭代,但不支持反射。但是,是的,我知道無法在編譯時迭代結構,這讓我非常困擾。有趣的是,這在Rust中被實現爲程序宏。 –

6

我會做兩個宏,就像這樣:

#define STYPE_FMT "%d %f" 
#define STYPE_MEMS(s) (s).a, (s).b 

然後,你可以這樣做:

printf("hello %s, stype: " STYPE_FMT "\n", "world", STYPE_MEMS(my_s)); 

是什麼讓這個方法優於「打印功能」的結構是,您可以使用您喜歡的任何printf系列函數的宏,併合並打印其他數據。

你可以得到更豐富的,而是做:

#define STYPE_FMT "%d %.*f" 
#define STYPE_MEMS(s) (s).a, 6, (s).b 
#define STYPE_MEMS_PREC(s, p) (s).a, (int)(p), (s).b 

,然後你可以使用默認的精度或選擇自定義的精度。