Path: csiph.com!eternal-september.org!feeder.eternal-september.org!nntp.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c Subject: Re: printf and time_t Date: Tue, 06 Jan 2026 16:29:04 -0800 Organization: None to speak of Lines: 56 Message-ID: <87h5sy2rlb.fsf@example.invalid> References: <10jfol6$2u6r8$1@news.xmission.com> <10jfs23$2liif$1@dont-email.me> <20260105105138.00005f0a@yahoo.com> <10jgbp7$2vdjt$1@news.xmission.com> <10jgdu9$2t8dh$1@nntp.eternal-september.org> <10jhkso$3c9r2$3@nntp.eternal-september.org> <20260106112938.00004446@yahoo.com> <10jj9st$3jbe4$2@dont-email.me> <20260106200522.000015ea@yahoo.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Wed, 07 Jan 2026 00:29:05 +0000 (UTC) Injection-Info: dont-email.me; posting-host="6f871b5ffe12a84f74a2becf62529d59"; logging-data="288036"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/E1AF4rDJTcU0DxdMqNZM8" User-Agent: Gnus/5.13 (Gnus v5.13) Cancel-Lock: sha1:S0xQE03bgMNUM9hAuVE8DimCqUo= sha1:Gdr/6cZq44X0EFgdKhzD3f6HCzo= Xref: csiph.com comp.lang.c:396236 Michael S writes: > On Tue, 6 Jan 2026 10:31:41 -0500 > James Kuyper wrote: >> On 2026-01-06 04:29, Michael S wrote: >> > On Tue, 6 Jan 2026 00:27:04 -0000 (UTC) >> > Lawrence D’Oliveiro wrote: >> ... >> >> Section 7.8 of the C spec defines macros you can use so you don’t >> >> have to hard-code assumptions about the lengths of integers in >> >> printf-format strings. >> > >> > Did you ever try to use them? They look ugly. >> >> Which is more important, correctness or beauty? > > It depends. > > When I know for sure that incorrectness has no consequences, like > in case of using %u to print 'unsigned long' on target with 32-bit > longs, or like using %llu to print 'unsigned long' on target with > 64-bit longs, then beauty wins. Easily. Seriously? An example: unsigned long n = 42; printf("%u\n", n); // incorrect printf("%lu\n", n); // correct Are you really saying that the second version is so much uglier than the first that you'd rather write incorrect code? If unsigned int and unsigned long happen to be the same size, both are likely to print "42". But what if your code is later compiled on a system with 32-bit unsigned int and 64-bit unsigned long? Even if I were certain the code would never be ported (and such certainty is often unjustified), I'd much rather use the correct code than waste time figuring out which incorrect code will happen to "work" on the current system, with the current version of the compiler and runtime library. Oh, and gcc and clang both warn about an incorrect format string. I agree that the macros in are ugly, and I rarely use them. If I want to print an integer value whose type I don't know, I'll probably cast to a predefined type that I know to be wide enough and use the specifier for that type. Though now that I think about it, I'm more likely to do that in throwaway code; for production code, I'd be more likely to use the macros. [...] -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */