我有一个结构来表示内存中的字符串,如下所示:
typedef struct {
size_t l;
char *s;
} str_t;
我相信使用size_t有助于指定char字符串的长度。我还想使用printf("%.*s\n", str.l, str.s)
打印此字符串。但是,*
精度需要int
参数,而不是size_t
。我一直无法找到与此有关的任何内容。有没有正确使用此结构,而int
调用中没有强制转换为printf()
?
答案 0 :(得分:5)
printf("%.*s\n", (int)str.l, str.s)
// ^^^^^ use a type cast
修改强>
好的,我没有正确地阅读这个问题。你不想使用类型转换,但我认为,在这种情况下:艰难。
或者只是使用fwrite
fwrite(str.s, str.l, 1, stdout);
printf("\n");
答案 1 :(得分:3)
你可以做一个宏
#define STR2(STR) (int const){ (STR).l }, (char const*const){ (STR).s }
然后将其用作printf("%.*s\n", STR2(str))
。
请注意,这会对STR
进行两次评估,因此请注意副作用,但您可能已经知道了。
修改强>
我正在使用复合初始值设定项,这些是隐式转换。如果出现问题,编译器会向您发出警告的可能性大于使用显式强制转换的情况。
例如,如果STR
的某个字段.l
是一个指针,并且您只将一个强制转换为int
,那么所有编译器都会很乐意将该指针转换为int
。类似于.s
字段,这实际上必须与char*
或兼容的东西相对应,否则您会看到警告或错误。
答案 2 :(得分:1)
不能保证size_t是int,或者它可以在int中表示。它没有定义int的确切大小,而是担心size_t的实现可能需要用来解决大内存区域(超过大内存区域)的问题,这只是C的遗产的一部分。其中的MAX_INT值。)
关于size_t的最常见错误是假设它等同于unsigned int。这些旧的bug很常见,从个人经验来看,它使得从32位架构移植到64位架构变得很痛苦,因为你需要撤消这个假设。
充其量,你可以使用演员表。如果你真的想摆脱演员阵容,你可以放弃使用size_t。