[英]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.