Two new proposals to the upcoming C2X standard

David Brown david.brown@hesbynett.no
Fri May 29 08:06:01 GMT 2020


On 28/05/2020 23:01, Xavier Del Campo Romero via Gcc wrote:
> Hello gcc team,
> 
> I have sent the following proposals to the committee, but they require them to be implemented at least into two major compilers, so I am proposing them to be implemented into gcc. This is going to be a rather lengthy e-mail, so TL;DR:
> 
> Proposal 1: New pointer-proof keyword _Lengthof to determine array length
> Motivation: solve silent bugs when a pointer is accidentally used instead of an array

In gcc, the simple "#define ARRAY_SIZE(a) sizeof (a) / sizeof *(a)" 
gives a compile-time warning if passed a pointer, since the introduction 
of "-Wsizeof-pointer-div" in -Wall in gcc 8.

I am not convinced that anyone who would be careful enough in their 
coding to use such a new "_Lengthof" feature would not already be using 
"-Wall" at least.  So for gcc, the new keyword would, I think, be 
useless.  And for any compiler without an equivalent warning (clang has 
it from version 7), it would likely to be easier to add the warning 
rather than the keyword.

Many people have figured out alternative "ARRAY_SIZE" macros that work 
with existing compilers and give compile-time warnings on naked 
pointers.  But like your suggestion below, they rely on compiler 
extensions such as gcc's "typeof".


So my counter-proposal for you would be to recommend gcc's "typeof" as a 
new keyword (spelt "_Typeof", with "typeof" as a macro in <stdtypeof.h>, 
in solid C tradition).

Then you have a feature that has a long-established history in two major 
compilers (gcc and clang, at least), has been massively used in 
real-world code for decades, and has a huge range of useful use-cases. 
Get "typeof" into the C standards and many people will thank you!  And 
then your _Lengthof becomes a simple macro that can be put in a standard 
header file, and needs no established implementation to be acceptable. 
(And you don't need any help from gcc or clang, except perhaps for 
describing the details of the semantics of "typeof".)



More information about the Gcc mailing list