This is the mail archive of the libc-help@sourceware.org mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Sunday 02 June 2013 20:40:35 Hongxu Chen wrote: > OndÅej BÃlka <neleai@seznam.cz> writes: > > On Sun, Jun 02, 2013 at 11:42:11PM +0800, Hongxu Chen wrote: > >> 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? > > > > Replace function call by simple table lookup where table is 1 for > > character inside class and 0 otherwise. > > Would you please tell some more details? You mean __isctype_f > implementation would actually lookup a _ISspacetype table and find > whether `c' is 1 in the table? Or you are talking about __isctype? __ctype_b_loc is a function call that returns the address of the data table. then the char is used an index into that table. -mike
Attachment:
signature.asc
Description: This is a digitally signed message part.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |