[英]Using size_t for specifying the precision of a string in C's printf
我有一個結構來表示內存中的字符串,如下所示:
typedef struct {
size_t l;
char *s;
} str_t;
我相信使用size_t對於指定char字符串的長度是有意義的。 我還想用printf("%.*s\\n", str.l, str.s)
打印這個字符串。 但是, *
precision需要一個int
參數,而不是size_t
。 我一直無法找到與此有關的任何內容。 有沒有正確使用這種結構,沒有在printf()
調用中轉換為int
?
printf("%.*s\n", (int)str.l, str.s)
// ^^^^^ use a type cast
編輯
好的,我沒有正確地閱讀這個問題。 你不想使用類型轉換,但我想,在這種情況下:艱難。
或者只是使用fwrite
fwrite(str.s, str.l, 1, stdout);
printf("\n");
你可以做一個宏
#define STR2(STR) (int const){ (STR).l }, (char const*const){ (STR).s }
然后將其用作printf("%.*s\\n", STR2(str))
。
請注意,這會對STR
兩次評估,因此請注意副作用,但您可能已經知道了。
編輯:
我正在使用復合初始值設定項,這些是隱式轉換。 如果出現問題,編譯器會向您發出警告的可能性大於使用顯式強制轉換的情況。
例如,如果STR
有一個字段.l
是一個指針而你只是將一個強制轉換為int
,那么所有編譯器都會很樂意將該指針轉換為int
。 類似於.s
字段,這實際上必須對應於char*
或兼容的東西,否則你會看到警告或錯誤。
不能保證size_t是int,或者它可以在int中表示。 這只是C未能定義int的確切大小的遺留問題的一部分,再加上可能需要利用size_t的實現來解決大內存區域(其中包含超過MAX_INT值的內存區域)的問題。
關於size_t的最常見錯誤是假設它等同於unsigned int。 這些舊的bug很常見,從個人經驗來看,它使得從32位架構移植到64位架構變得很麻煩,因為你需要撤消這個假設。
充其量,你可以使用演員表。 如果你真的想要擺脫演員表,你可以放棄使用size_t。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.