Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 17 Apr 2015 21:24:09 +0300 (MSK)
From: Alexander Monakov <>
Subject: Re: Explicit casts in ctype.h suppress compiler warnings

> In another place (math.h) I removed this type of compound literal
> usage because it was incompatible with C++, but the macros are
> suppressed in C++ anyway. Still they might break -pedantic with
> -std=c89. I do like this approach best in principle if it works
> though, because the rules for when an error occurs are basically the
> same as the rules for a real function.

I confirm that the idea works, and as Rich said it causes a warning with
-pedantic -std=c89 with gcc-4.5..4.7 (but not 4.8, 4.9).

> Do you have an idea in mind for how we could achieve that? I suspect
> the macros are still better optimizable than the inline function
> approach, so I'd lean towards doing a macro that avoids evaluating c
> and just checks its type, which would involve using ?: I think.

I admit I was thinking of doing isspace-style inlines everywhere, but thanks
to your suggestion I was able to come up with this:

static __inline void __is_int(int a) {}
#define isdigit(a) (__is_int(0?(a):0), ((unsigned)(a)-'0') < 10)

Actually, thinking about GCC behavior a bit more, I was lucky that there's a
warning for isspace in the first place: wrong argument to __isspace originates
in the context of a system-header-declared macro, so generally I'd say that
the same warning-suppression logic should have applied.


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.