tech-toolchain archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Proposal: change requirement for tools from C89 to C99
On Mon, 31 Jan 2022 at 14:53, Roland Illig <roland.illig%gmx.de@localhost> wrote:
>
> Am 31.01.2022 um 11:14 schrieb Robert Elz:
> > I don't follow C standards. What are the c99 features we'd
> > want to use in tools that don't work in c89?
>
> Here are some things I'd like to change, based on what I found in
> usr.bin/make/var.c and the change list from C99 Foreword paragraph 5:
>
> * Unconditionally use bool, without having to fall back to a custom
> typedef that would change the semantics of the type subtly (C99 6.3.1.2).
>
> * Reduce the scope of local variables by declaring them at the point
> where they are initialized, to remove dangling pointers while stepping
> through the code.
>
> * Move the declaration of i into the corresponding for loops.
>
> * Declare struct members as const if they are not modified after
> initialization, to make reasoning over the code easier. I currently use
> a conditionally defined macro const_member for that, but it's ugly.
>
> * Use the function modifier 'inline' unconditionally.
Or not bother. The compiler tends to have its own ideas, especially
when link-time-optimization is enabled.
> * Use the type 'long long' and the corresponding strtoull unconditionally.
size_t + %zu were pointed out earlier; much easier
intmax_t %jd strtoimax() are perhaps less obvious; and given how
standards have been going, more contraversial
> * Use snprintf unconditionally.
>
> * Use compound literals and designated initializers such as
> (PatternFlags){ .matched = false }, to avoid having to define an inline
> function for initializing a single variable.
The idiom:
my_struct = {0};
is common, but older compilers tks-tsk when it's used.
Also, given:
struct { char c, long l, } s = {0};
don't assume that the padding between c and l is zero. This isn't
c99, just compilers taking advantage of the freedom being granted.
> * Use macros with a variable number of arguments, instead of the current
> DEBUG0, DEBUG1, DEBUG2, DEBUG3, DEBUG4, DEBUG5.
There's a got-ya here. GCC/LLVM have the extension:
DEBUG(FMT, ....) printf(FMT, ##__VA_ARGS__)
because c99 barfs with DEBUG("hi") (yea, __VA_OPT__(,) is now more
correct, but ## is more likely to work).
> * Use __func__ in low-level messages for debug logging.
>
> * Use va_copy in error handling and string formatting functions.
>
> * Initialize a struct from an initializer-list of non-constant expressions.
>
> While each of the above is a small change, together they make the code
> cleaner by using fewer macros and avoiding some boilerplate.
... and, of course, continue to not use variable length arrays (which
were booted out in c11 anyway).
Oh, and have a bunfight over // comments, and c11's anonymous unions :-)
Home |
Main Index |
Thread Index |
Old Index