This is the mail archive of the
libc-help@sourceware.org
mailing list for the glibc project.
Re: Declaration of isspace in C/C++ not consistent?
- From: Hongxu Chen <leftcopy dot chx at gmail dot com>
- To: Mike Frysinger <vapier at gentoo dot org>
- Cc: libc-help at sourceware dot org
- Date: Sun, 02 Jun 2013 23:42:11 +0800
- Subject: Re: Declaration of isspace in C/C++ not consistent?
- References: <87ip1wvaf2 dot fsf at gmail dot com> <201306021110 dot 57119 dot vapier at gentoo dot org>
Mike Frysinger <vapier@gentoo.org> writes:
> On Sunday 02 June 2013 10:45:21 Hongxu Chen wrote:
>> Hi list,
>>
>> Maybe this question is a bit silly, but I just cannot understand why
>> `isspace` seems not consistent for C and C++(I have put this question in
>> stackoverflow but no satisfactory answer has been given yet).
>>
>> I am using *clang* analyzer to get the definition information and I know
>> quite little about the mechanism behind it, so the declaration result
>> might not be accurate; but I am just confused.
>>
>> For c code like this:
>>
>> // test.c
>> #include <ctype.h>
>> int main(int argc, char *argv[]) {
>> isspace('a');
>> return 0;
>> }
>>
>> clang reports below as the declaration of isspace:
>>
>> # define isspace(c) __isctype((c), _ISspace) // LINE 207 in
>> /usr/include/ctype.h
>>
>> and when for this snippet:
>>
>> // test.cpp
>> #include <cctype>
>> int main() {
>> std::isspace('t');
>> return 0;
>> }
>>
>> clang reports the declaration here:
>>
>> __exctype (isspace); // LINE 120 in /usr/include/ctype.h
>> // #define __exctype(name) extern int name (int) __THROW
>>
>> So why should there be such a difference?
>
> glibc provides ctype.h which follows POSIX:
> http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ctype.h.html
> we provide both real funcs and macros for each because the standard allows it,
> and the macro ends up producing better code at runtime.
You mean that the c code is a macro implementation and it generates
better runtime binary while C++ code uses the function one? By saying
macro you mean `__ctype_b_loc'?(Actually I don't know what this symbol
does)
# define __isctype(c, type) \
((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type)
Also there is another implementation called `__isctype_f', which is
defined as:
# define __isctype_f(type) \
__extern_inline int \
is##type (int __c) __THROW \
{ \
return (*__ctype_b_loc ())[(int) (__c)] & (unsigned short int) _IS##type; \
}
Then what's this supposed to be doing?
>
> gcc provides cctype which follows various C++ standards.
> -mike
Again forgive me that I really know little about glibc, but I cannot find so
many docs about it by Googling.
--
Regards,
Hongxu Chen