mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-27 04:41:02 +08:00
11bf311edc
2007-01-11 Jakub Jelinek <jakub@redhat.com> * sysdeps/i386/soft-fp/sfp-machine.h: Remove. * sysdeps/x86_64/soft-fp/sfp-machine.h: Likewise. 2007-01-10 Ulrich Drepper <drepper@redhat.com> * io/fts.c: Make sure fts_cur is always valid after return from fts_read. Patch by Miloslav Trmac <mitr@redhat.com>. 2006-10-27 Richard Sandiford <richard@codesourcery.com> * elf/elf.h (R_MIPS_GLOB_DAT): Define. (R_MIPS_NUM): Bump by 1. 2007-01-03 Jakub Jelinek <jakub@redhat.com> * posix/execvp.c: Include alloca.h. (allocate_scripts_argv): Renamed to... (scripts_argv): ... this. Don't allocate buffer here nor count arguments. (execvp): Use alloca if possible. * posix/Makefile: Add rules to build and run tst-vfork3 test. * posix/tst-vfork3.c: New test. * stdlib/Makefile (tst-strtod3-ENV): Define. 2007-01-02 Ulrich Drepper <drepper@redhat.com> * posix/getconf.c: Update copyright year. * nss/getent.c: Likewise. * iconv/iconvconfig.c: Likewise. * iconv/iconv_prog.c: Likewise. * elf/ldconfig.c: Likewise. * catgets/gencat.c: Likewise. * csu/version.c: Likewise. * elf/ldd.bash.in: Likewise. * elf/sprof.c (print_version): Likewise. * locale/programs/locale.c: Likewise. * locale/programs/localedef.c: Likewise. * nscd/nscd.c (print_version): Likewise. * debug/xtrace.sh: Likewise. * malloc/memusage.sh: Likewise. * malloc/mtrace.pl: Likewise. * debug/catchsegv.sh: Likewise. 2006-12-24 Ulrich Drepper <drepper@redhat.com> * malloc/malloc.c (sYSMALLOc): Remove some unnecessary alignment attempts. 2006-12-23 Ulrich Drepper <drepper@redhat.com> * posix/wordexp.c: Remove some unnecessary tests. 2006-12-20 SUGIOKA Toshinobu <sugioka@itonet.co.jp> * sysdeps/unix/sysv/linux/sh/bits/shm.h: New file. * nss/getXXbyYY_r.c: Include atomic.h. (INTERNAL (REENTRANT_NAME)): Write startp after start_fct, add atomic_write_barrier () in between. 2006-11-28 Jakub Jelinek <jakub@redhat.com> * elf/dl-support.c: Include dl-procinfo.h. * sysdeps/powerpc/dl-procinfo.h (PPC_PLATFORM_POWER4, PPC_PLATFORM_PPC970, PPC_PLATFORM_POWER5, PPC_PLATFORM_POWER5_PLUS, PPC_PLATFORM_POWER6, PPC_PLATFORM_CELL_BE, PPC_PLATFORM_POWER6X): Define. (_dl_string_platform): Use PPC_PLATFORM_* macros instead of hardcoded constants. * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platform): Use PPC_PLATFORM_* macros for array designators. 2006-11-11 Steven Munroe <sjmunroe@us.ibm.com> * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Add 3 new cap names to the beginning. (_dl_powerpc_platforms): Add "power6x". * sysdeps/powerpc/dl-procinfo.h (_DL_HWCAP_FIRST): Decrease. (HWCAP_IMPORTANT): Add PPC_FEATURE_HAS_DFP. (_DL_PLATFORMS_COUNT): Increase. (_dl_string_platform): Handle power6x case. * sysdeps/powerpc/sysdep.h (PPC_FEATURE_PA6T, PPC_FEATURE_HAS_DFP, PPC_FEATURE_POWER6_EXT): Define. (PPC_FEATURE_POWER5, PPC_FEATURE_POWER5_PLUS): Correct Comment. [-2^31 .. 2^31) range. * sysdeps/unix/sysv/linux/bits/statvfs.h: Define ST_RELATIME. * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags): Handle relatime mount option. 2006-12-13 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S: Include kernel-features.h. 2006-12-11 Ulrich Drepper <drepper@redhat.com> * stdlib/strtod_l.c (____STRTOF_INTERNAL): Parse thousand separators also if no non-zero digits found. * stdlib/Makefile (tests): Add tst-strtod3. [BZ #3664] * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix test to recognize empty parsed strings. * stdlib/Makefile (tests): Add tst-strtod2. * stdlib/tst-strtod2.c: New file. [BZ #3673] * stdlib/strtod_l.c (____STRTOF_INTERNAL): Fix exp_limit computation. * stdlib/Makefile (tests): Add tst-atof2. * stdlib/tst-atof2.c: New file. [BZ #3674] * stdlib/strtod_l.c (____STRTOF_INTERNAL): Adjust exponent value correctly if removing trailing zero of hex-float. * stdlib/Makefile (tests): Add tst-atof1. * stdlib/tst-atof1.c: New file. * misc/mntent_r.c (__hasmntopt): Check p[optlen] even when p == rest. Start searching for next comma at p rather than rest. * misc/Makefile (tests): Add tst-mntent2. * misc/tst-mntent2.c: New test. 2006-12-08 Ulrich Drepper <drepper@redhat.com> * malloc/memusage.c: Handle realloc with new size of zero and non-NULL pointer correctly. (me): Really write first record twice. (struct entry): Make format bi-arch safe. (dest): Write out more realloc statistics. * malloc/memusagestat.c (struct entry): Make format bi-arch safe. 2006-12-05 Jakub Jelinek <jakub@redhat.com> * nis/nis_subr.c (nis_getnames): Revert last change. 2006-12-03 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/unix/sysv/linux/sh/sys/io.h: Removed. 2006-11-30 H.J. Lu <hongjiu.lu@intel.com> * sysdeps/i386/i686/memcmp.S: Use jump table as the base of jump table entries. 2006-11-30 Jan Kratochvil <jan.kratochvil@redhat.com> * sysdeps/unix/sysv/linux/i386/clone.S: Provide CFI for the outermost `clone' function to ensure proper unwinding stop of gdb. * sysdeps/unix/sysv/linux/x86_64/clone.S: Likewise. 2006-12-01 Ulrich Drepper <drepper@redhat.com> * nscd/nscd.init: Remove obsolete and commented-out -S option handling. 2006-11-23 Jakub Jelinek <jakub@redhat.com> [BZ #3514] * manual/string.texi (strncmp): Fix pastos from wcscmp description. [BZ #3515] * manual/string.texi (strtok): Remove duplicate paragraph. 2006-12-01 Jan Kratochvil <jan.kratochvil@redhat.com> * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Fix compatibility with libgcc not supporting `rflags' unwinding (register # >= 17). 2006-11-30 Jakub Jelinek <jakub@redhat.com> * sunrpc/svc_run.c (svc_run): Set my_pollfd to new_pollfd if realloc succeeded. 2006-11-29 Daniel Jacobowitz <dan@codesourcery.com> Jakub Jelinek <jakub@redhat.com> Jan Kratochvil <jan.kratochvil@redhat.com> * sysdeps/unix/sysv/linux/x86_64/sigaction.c (restore_rt): Add correct unwind information. * sysdeps/unix/sysv/linux/x86_64/Makefile: Provide symbols for 'restore_rt' even in the 'signal' directory. * sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym: Extend the regs list. malloc crashed. Don't allocate memory unnecessarily in each loop. 2006-10-21 Jakub Jelinek <jakub@redhat.com> * resolv/mapv4v6addr.h (map_v4v6_address): Fix last change. 2006-11-20 Ulrich Drepper <drepper@redhat.com> * resolv/mapv4v6addr.h (map_v4v6_address): Optimize a bit. 2006-11-18 Bruno Haible <bruno@clisp.org> * sysdeps/unix/sysv/linux/i386/getgroups.c (__getgroups): Invoke __sysconf only after having tried to call getgroups32. 2006-11-19 Ulrich Drepper <drepper@redhat.com> * nss/nss_files/files-hosts.c (LINE_PARSER): Support IPv6-style addresses for IPv4 queries if they can be mapped. 2006-11-16 Jakub Jelinek <jakub@redhat.com> * sysdeps/x86_64/fpu/s_copysignf.S (__copysignf): Switch to .text. * sysdeps/x86_64/fpu/s_copysign.S (__copysign): Likewise. (signmask): Add .size directive. (othermask): Add .type directive. 2006-11-14 Ulrich Drepper <drepper@redhat.com> * po/nl.po: Update from translation team. * timezone/zdump.c: Redo fix for BZ #3137. 2006-11-14 Jakub Jelinek <jakub@redhat.com> * nss/nss_files/files-alias.c (get_next_alias): Set line back to first_unused after parsing :include: file. * timezone/africa: Update from tzdata2006o. * timezone/antarctica: Likewise. * timezone/asia: Likewise. * timezone/australasia: Likewise. * timezone/backward: Likewise. * timezone/europe: Likewise. * timezone/iso3166.tab: Likewise. * timezone/northamerica: Likewise. * timezone/southamerica: Likewise. * timezone/zone.tab: Likewise. * time/tzfile.c (__tzfile_read): Extend to handle new file format on machines with 64-bit time_t. * timezone/checktab.awk: Update from tzcode2006o. * timezone/ialloc.c: Likewise. * timezone/private.h: Likewise. * timezone/scheck.c: Likewise. * timezone/tzfile.h: Likewise. * timezone/tzselect.ksh: Likewise. * timezone/zdump.c: Likewise. * timezone/zic.c: Likewise. [BZ #3483] * elf/ldconfig.c (main): Call setlocale and textdomain. Patch mostly by Benno Schulenberg <bensberg@justemail.net>. [BZ #3480] * manual/argp.texi: Fix typos. * manual/charset.texi: Likewise. * manual/errno.texi: Likewise. * manual/filesys.texi: Likewise. * manual/lang.texi: Likewise. * manual/maint.texi: Likewise. * manual/memory.texi: Likewise. * manual/message.texi: Likewise. * manual/resource.texi: Likewise. * manual/search.texi: Likewise. * manual/signal.texi: Likewise. * manual/startup.texi: Likewise. * manual/stdio.texi: Likewise. * manual/sysinfo.texi: Likewise. * manual/syslog.texi: Likewise. * manual/time.texi: Likewise. Patch by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>. [BZ #3465] * sunrpc/clnt_raw.c: Minimal message improvements. * sunrpc/pm_getmaps.c: Likewise. * nis/nss_nisplus/nisplus-publickey.c: Likewise. * nis/nis_print_group_entry.c: Likewise. * locale/programs/repertoire.c: Likewise. * locale/programs/charmap.c: Likewise. * malloc/memusage.sh: Likewise. * elf/dl-deps.c: Likewise. * locale/programs/ld-collate.c: Likewise. * libio/vswprintf.c: Likewise. * malloc/memusagestat.c: Likewise. * sunrpc/auth_unix.c: Likewise. * sunrpc/rpc_main.c: Likewise. * nscd/cache.c: Likewise. * locale/programs/repertoire.c: Unify output messages. * locale/programs/charmap.c: Likewise. * locale/programs/ld-ctype.c: Likewise. * locale/programs/ld-monetary.c: Likewise. * locale/programs/ld-numeric.c: Likewise. * locale/programs/ld-time.c: Likewise. * elf/ldconfig.c: Likewise. * nscd/selinux.c: Likewise. * elf/cache.c: Likewise. Patch mostly by Benno Schulenberg <bensberg@justemail.net>. 2006-11-10 Jakub Jelinek <jakub@redhat.com> * string/strxfrm_l.c (STRXFRM): Fix trailing \1 optimization if N is one bigger than return value. * string/tst-strxfrm2.c (do_test): Also test strxfrm with l1 + 1 and l1 last arguments, if buf is defined, verify the return value equals to strlen (buf) and verify no byte beyond passed length is modified. 2006-11-10 Ulrich Drepper <drepper@redhat.com> * po/sv.po: Update from translation team. * sysdeps/gnu/siglist.c (__old_sys_siglist, __old_sys_sigabbrev): Use __new_sys_siglist instead of _sys_siglist_internal as second macro argument. (_old_sys_siglist): Use declare_symbol_alias macro instead of strong_alias. 2006-11-09 Ulrich Drepper <drepper@redhat.com> [BZ #3493] * posix/unistd.h (sysconf): Remove const attribute. * sysdeps/posix/getaddrinfo.c (getaddrinfo): Fix test for temporary or deprecated addresses. Patch by Sridhar Samudrala <sri@us.ibm.com>. * string/Makefile (tests): Add tst-strxfrm2. * string/tst-strxfrm2.c: New file. 2006-10-09 Jakub Jelinek <jakub@redhat.com> * elf/dl-debug.c (_dl_debug_initialize): Check r->r_map for 0 rather than r->r_brk. * string/strxfrm_l.c (STRXFRM): Do the trailing \1 removal optimization even if needed > n. 2006-11-07 Jakub Jelinek <jakub@redhat.com> * include/libc-symbols.h (declare_symbol): Rename to... (declare_symbol_alias): ... this. Add ORIGINAL argument, imply strong_alias (ORIGINAL, SYMBOL) in asm to make sure it preceedes .size directive. * sysdeps/gnu/errlist-compat.awk: Adjust for declare_symbol_alias changes. * sysdeps/gnu/siglist.c: Likewise. 2006-11-03 Steven Munroe <sjmunroe@us.ibm.com> * sysdeps/powerpc/fpu/bits/mathinline.h [__LIBC_INTERNAL_MATH_INLINES]: Moved to ... * sysdeps/powerpc/fpu/math_private.h: ...here. New file. 2006-11-05 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/i386/sysconf.c (intel_check_word): Update handling of cache descriptor 0x49 for new models. * sysdeps/unix/sysv/linux/x86_64/sysconf.c (intel_check_word): Likewise. 2006-11-02 Ulrich Drepper <drepper@redhat.com> * configure.in: Work around ld --help change and avoid -z relro test completely if the architecture doesn't care about security. 2006-11-01 Ulrich Drepper <drepper@redhat.com> * po/sv.po: Update from translation team. 2006-10-31 Ulrich Drepper <drepper@redhat.com> * stdlib/atexit.c (atexit): Don't mark as hidden when used to generate compatibility version. 2006-10-29 Ulrich Drepper <drepper@redhat.com> * configure.in: Relax -z relro requirement a bit. * po/sv.po: Update from translation team. 2006-10-29 Jakub Jelinek <jakub@redhat.com> * elf/dl-sym.c (do_sym): Use RTLD_SINGLE_THREAD_P. * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Likewise. * elf/dl-close.c (_dl_close_worker): Likewise. * elf/dl-open.c (_dl_open_worker): Likewise. * sysdeps/generic/sysdep-cancel.h (RTLD_SINGLE_THREAD_P): Define. * configure.in: Require assembler support for visibility, compiler support for visibility and aliases, linker support for various -z options. * Makeconfig: Remove conditional code which now is unnecessary. * config.h.in: Likewise. * config.make.in: Likewise. * dlfcn/Makefile: Likewise. * elf/Makefile: Likewise. * elf/dl-load.c: Likewise. * elf/rtld.c: Likewise. * include/libc-symbols.h: Likewise. * include/stdio.h: Likewise. * io/Makefile: Likewise. * io/fstat.c: Likewise. * io/fstat64.c: Likewise. * io/fstatat.c: Likewise. * io/fstatat64.c: Likewise. * io/lstat.c: Likewise. * io/lstat64.c: Likewise. * io/mknod.c: Likewise. * io/mknodat.c: Likewise. * io/stat.c: Likewise. * io/stat64.c: Likewise. * libio/stdio.c: Likewise. * nscd/Makefile: Likewise. * stdlib/Makefile: Likewise. * stdlib/atexit.c: Likewise. * sysdeps/generic/ldsodefs.h: Likewise. * sysdeps/i386/dl-machine.h: Likewise. * sysdeps/i386/sysdep.h: Likewise. * sysdeps/i386/i686/memcmp.S: Likewise. * sysdeps/powerpc/powerpc32/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/i386/sigaction.c: Likewise. * sysdeps/unix/sysv/linux/x86_64/sigaction.c: Likewise. * Makerules: USE_TLS support is now default. * tls.make.c: Likewise. * csu/Versions: Likewise. * csu/libc-start.c: Likewise. * csu/libc-tls.c: Likewise. * csu/version.c: Likewise. * dlfcn/dlinfo.c: Likewise. * elf/dl-addr.c: Likewise. * elf/dl-cache.c: Likewise. * elf/dl-close.c: Likewise. * elf/dl-iteratephdr.c: Likewise. * elf/dl-load.c: Likewise. * elf/dl-lookup.c: Likewise. * elf/dl-object.c: Likewise. * elf/dl-open.c: Likewise. * elf/dl-reloc.c: Likewise. * elf/dl-support.c: Likewise. * elf/dl-sym.c: Likewise. * elf/dl-sysdep.c: Likewise. * elf/dl-tls.c: Likewise. * elf/ldconfig.c: Likewise. * elf/rtld.c: Likewise. * elf/tst-tls-dlinfo.c: Likewise. * elf/tst-tls1.c: Likewise. * elf/tst-tls10.h: Likewise. * elf/tst-tls14.c: Likewise. * elf/tst-tls2.c: Likewise. * elf/tst-tls3.c: Likewise. * elf/tst-tls4.c: Likewise. * elf/tst-tls5.c: Likewise. * elf/tst-tls6.c: Likewise. * elf/tst-tls7.c: Likewise. * elf/tst-tls8.c: Likewise. * elf/tst-tls9.c: Likewise. * elf/tst-tlsmod1.c: Likewise. * elf/tst-tlsmod13.c: Likewise. * elf/tst-tlsmod13a.c: Likewise. * elf/tst-tlsmod14a.c: Likewise. * elf/tst-tlsmod2.c: Likewise. * elf/tst-tlsmod3.c: Likewise. * elf/tst-tlsmod4.c: Likewise. * elf/tst-tlsmod5.c: Likewise. * elf/tst-tlsmod6.c: Likewise. * include/errno.h: Likewise. * include/link.h: Likewise. * include/tls.h: Likewise. * locale/global-locale.c: Likewise. * locale/localeinfo.h: Likewise. * malloc/arena.c: Likewise. * malloc/hooks.c: Likewise. * malloc/malloc.c: Likewise. * resolv/Versions: Likewise. * sysdeps/alpha/dl-machine.h: Likewise. * sysdeps/alpha/libc-tls.c: Likewise. * sysdeps/generic/ldsodefs.h: Likewise. * sysdeps/generic/tls.h: Likewise. * sysdeps/i386/dl-machine.h: Likewise. * sysdeps/ia64/dl-machine.h: Likewise. * sysdeps/ia64/libc-tls.c: Likewise. * sysdeps/mach/hurd/fork.c: Likewise. * sysdeps/mach/hurd/i386/tls.h: Likewise. * sysdeps/powerpc/powerpc32/dl-machine.c: Likwise. * sysdeps/powerpc/powerpc32/dl-machine.h: Likewise. * sysdeps/powerpc/powerpc64/dl-machine.h: Likewise. * sysdeps/s390/libc-tls.c: Likewise. * sysdeps/s390/s390-32/dl-machine.h: Likewise. * sysdeps/s390/s390-64/dl-machine.h: Likewise. * sysdeps/sh/dl-machine.h: Likewise. * sysdeps/sparc/sparc32/dl-machine.h: Likewise. * sysdeps/sparc/sparc64/dl-machine.h: Likewise. * sysdeps/x86_64/dl-machine.h: Likewise. [BZ #3426] * stdlib/stdlib.h: Adjust comment for canonicalize_file_name to reality. 2006-10-27 Jakub Jelinek <jakub@redhat.com> * elf/dl-lookup.c (_dl_debug_bindings): Remove unused symbol_scope argument. (_dl_lookup_symbol_x): Adjust caller. * sysdeps/generic/ldsodefs.h (struct link_namespaces): Remove _ns_global_scope. * elf/rtld.c (dl_main): Don't initialize _ns_global_scope. * elf/dl-libc.c: Revert l_scope name changes. * elf/dl-load.c: Likewise. * elf/dl-object.c: Likewise. * elf/rtld.c: Likewise. * elf/dl-close.c (_dl_close): Likewise. * elf/dl-open.c (dl_open_worker): Likewise. If not SINGLE_THREAD_P, always use __rtld_mrlock_{change,done}. Always free old scope list here if not l_scope_mem. * elf/dl-runtime.c (_dl_fixup, _dl_profile_fixup): Revert l_scope name change. Never free scope list here. Just __rtld_mrlock_lock before the lookup and __rtld_mrlock_unlock it after the lookup. * elf/dl-sym.c: Likewise. * include/link.h (struct r_scoperec): Remove. (struct link_map): Replace l_scoperec with l_scope, l_scoperec_mem with l_scope_mem and l_scoperec_lock with l_scope_lock. 2006-10-25 Ulrich Drepper <drepper@redhat.com> * sysdeps/gnu/netinet/tcp.h: Define TCP_CONGESTION. 2006-10-18 Ulrich Drepper <drepper@redhat.com> * configure.in: Disable building profile libraries by default. 2006-10-18 Ulrich Drepper <drepper@redhat.com> * elf/dl-lookup.c (_dl_lookup_symbol_x): Add warning to _dl_lookup_symbol_x code. 2006-10-17 Jakub Jelinek <jakub@redhat.com> * elf/dl-runtime.c: Include sysdep-cancel.h. (_dl_fixup, _dl_profile_fixup): Use __rtld_mrlock_* and scoperec->nusers only if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros. * elf/dl-sym.c: Include sysdep-cancel.h. (do_sym): Use __rtld_mrlock_* and scoperec->nusers only if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros. * elf/dl-close.c: Include sysdep-cancel.h. (_dl_close): Use __rtld_mrlock_* and scoperec->nusers only if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros. * elf/dl-open.c: Include sysdep-cancel.h. (dl_open_worker): Use __rtld_mrlock_* and scoperec->nusers only if !SINGLE_THREAD_P. Use atomic_* instead of catomic_* macros. 2006-10-17 Jakub Jelinek <jakub@redhat.com> [BZ #3313] * malloc/malloc.c (malloc_consolidate): Set maxfb to address of last fastbin rather than end of fastbin array. 2006-10-18 Ulrich Drepper <drepper@redhat.com> * sysdeps/i386/i486/bits/atomic.h (catomic_decrement): Use correct body macro. * sysdeps/x86_64/bits/atomic.h (__arch_c_compare_and_exchange_val_64_acq): Add missing casts. (catomic_decrement): Use correct body macro. 2006-10-17 Jakub Jelinek <jakub@redhat.com> * include/atomic.h: Add a unique prefix to all local variables in macros. * csu/tst-atomic.c (do_test): Test also catomic_* macros. 2006-10-14 Ulrich Drepper <drepper@redhat.com> * resolv/arpa/nameser.h: Document that ns_t_a6 is deprecated. [BZ #3313] * malloc/malloc.c (malloc_consolidate): Don't use get_fast_max to determine highest fast bin to consolidate, always look into all of them. (do_check_malloc_state): Only require for empty bins for large sizes in main arena. * libio/stdio.h: Add more __wur attributes. 2006-11-12 Andreas Jaeger <aj@suse.de> [BZ #2510] * manual/search.texi (Hash Search Function): Clarify. (Array Search Function): Clarify. 2006-11-12 Joseph Myers <joseph@codesourcery.com> [BZ #2830] * math/atest-exp.c (main): Cast hex value to mp_limb_t before shifting. * math/atest-exp2.c (read_mpn_hex): Likewise. * math/atest-sincos.c (main): Likewise. * sysdeps/unix/sysv/linux/syscalls.list: Add epoll_pwait. * sysdeps/unix/sysv/linux/sys/epoll.h: Declare epoll_pwait. * sysdeps/unix/sysv/linux/Versions (libc): Add epoll_pwait for version GLIBC_2.6. * Versions.def: Add GLIBC_2.6 for libc. * sysdeps/i386/i486/bits/atomic.h: Add catomic_* support. 2006-10-11 Jakub Jelinek <jakub@redhat.com> * malloc/malloc.c (_int_malloc): Remove unused any_larger variable. * nis/nis_defaults.c (__nis_default_access): Don't call getenv twice. * nis/nis_subr.c (nis_getnames): Use __secure_getenv instead of getenv. * sysdeps/generic/unsecvars.h: Add NIS_PATH. 2006-10-11 Ulrich Drepper <drepper@redhat.com> * include/atomic.c: Define catomic_* operations. * sysdeps/x86_64/bits/atomic.h: Likewise. Fix a few minor problems. * stdlib/cxa_finalize.c: Use catomic_* operations instead of atomic_*. * malloc/memusage.c: Likewise. * gmon/mcount.c: Likewise. * elf/dl-close.c: Likewise. * elf/dl-open.c: Likewise. * elf/dl-profile.c: Likewise. * elf/dl-sym.c: Likewise. * elf/dl-runtime.c: Likewise. * elf/dl-fptr.c: Likewise. * resolv/res_libc.c: Likewise. 2006-10-10 Roland McGrath <roland@frob.com> * sysdeps/mach/hurd/utimes.c: Use a union to avoid an improper cast. * sysdeps/mach/hurd/futimes.c: Likewise. * sysdeps/mach/hurd/lutimes.c: Likewise. 2006-10-09 Ulrich Drepper <drepper@redhat.com> Jakub Jelinek <jakub@redhat.com> Implement reference counting of scope records. * elf/dl-close.c (_dl_close): Remove all scopes from removed objects from the list in objects which remain. Always allocate new scope record. * elf/dl-open.c (dl_open_worker): When growing array for scopes, don't resize, allocate a new one. * elf/dl-runtime.c: Update reference counters before using a scope array. * elf/dl-sym.c: Likewise. * elf/dl-libc.c: Adjust for l_scope name change. * elf/dl-load.c: Likewise. * elf/dl-object.c: Likewise. * elf/rtld.c: Likewise. * include/link.h: Include <rtld-lowlevel.h>. Define struct r_scoperec. Replace r_scope with pointer to r_scoperec structure. Add l_scoperec_lock. * sysdeps/generic/ldsodefs.h: Include <rtld-lowlevel.h>. * sysdeps/generic/rtld-lowlevel.h: New file. * include/atomic.h: Rename atomic_and to atomic_and_val and atomic_or to atomic_or_val. Define new macros atomic_and and atomic_or which do not return values. * sysdeps/x86_64/bits/atomic.h: Define atomic_and and atomic_or. Various cleanups. * sysdeps/i386/i486/bits/atomic.h: Likewise. * po/sv.po: Update from translation team. 2006-10-07 Ulrich Drepper <drepper@redhat.com> * Versions.def: Add GLIBC_2.6 to libpthread. * include/shlib-compat.h (SHLIB_COMPAT): Expand parameters before use. (versioned_symbol): Likewise. (compat_symbol): Likewise. * po/tr.po: Update from translation team. * nis/Banner: Removed. It's been integral part forever and the author info is incomplete anyway. * libio/Banner: Likewise. 2006-10-06 Ulrich Drepper <drepper@redhat.com> * version.h (VERSION): Bump to 2.5.90 for new development tree.
1284 lines
47 KiB
Plaintext
1284 lines
47 KiB
Plaintext
@c This node must have no pointers.
|
|
@node Language Features
|
|
@c @node Language Features, Library Summary, , Top
|
|
@c %MENU% C language features provided by the library
|
|
@appendix C Language Facilities in the Library
|
|
|
|
Some of the facilities implemented by the C library really should be
|
|
thought of as parts of the C language itself. These facilities ought to
|
|
be documented in the C Language Manual, not in the library manual; but
|
|
since we don't have the language manual yet, and documentation for these
|
|
features has been written, we are publishing it here.
|
|
|
|
@menu
|
|
* Consistency Checking:: Using @code{assert} to abort if
|
|
something ``impossible'' happens.
|
|
* Variadic Functions:: Defining functions with varying numbers
|
|
of args.
|
|
* Null Pointer Constant:: The macro @code{NULL}.
|
|
* Important Data Types:: Data types for object sizes.
|
|
* Data Type Measurements:: Parameters of data type representations.
|
|
@end menu
|
|
|
|
@node Consistency Checking
|
|
@section Explicitly Checking Internal Consistency
|
|
@cindex consistency checking
|
|
@cindex impossible events
|
|
@cindex assertions
|
|
|
|
When you're writing a program, it's often a good idea to put in checks
|
|
at strategic places for ``impossible'' errors or violations of basic
|
|
assumptions. These kinds of checks are helpful in debugging problems
|
|
with the interfaces between different parts of the program, for example.
|
|
|
|
@pindex assert.h
|
|
The @code{assert} macro, defined in the header file @file{assert.h},
|
|
provides a convenient way to abort the program while printing a message
|
|
about where in the program the error was detected.
|
|
|
|
@vindex NDEBUG
|
|
Once you think your program is debugged, you can disable the error
|
|
checks performed by the @code{assert} macro by recompiling with the
|
|
macro @code{NDEBUG} defined. This means you don't actually have to
|
|
change the program source code to disable these checks.
|
|
|
|
But disabling these consistency checks is undesirable unless they make
|
|
the program significantly slower. All else being equal, more error
|
|
checking is good no matter who is running the program. A wise user
|
|
would rather have a program crash, visibly, than have it return nonsense
|
|
without indicating anything might be wrong.
|
|
|
|
@comment assert.h
|
|
@comment ISO
|
|
@deftypefn Macro void assert (int @var{expression})
|
|
Verify the programmer's belief that @var{expression} is nonzero at
|
|
this point in the program.
|
|
|
|
If @code{NDEBUG} is not defined, @code{assert} tests the value of
|
|
@var{expression}. If it is false (zero), @code{assert} aborts the
|
|
program (@pxref{Aborting a Program}) after printing a message of the
|
|
form:
|
|
|
|
@smallexample
|
|
@file{@var{file}}:@var{linenum}: @var{function}: Assertion `@var{expression}' failed.
|
|
@end smallexample
|
|
|
|
@noindent
|
|
on the standard error stream @code{stderr} (@pxref{Standard Streams}).
|
|
The filename and line number are taken from the C preprocessor macros
|
|
@code{__FILE__} and @code{__LINE__} and specify where the call to
|
|
@code{assert} was made. When using the GNU C compiler, the name of
|
|
the function which calls @code{assert} is taken from the built-in
|
|
variable @code{__PRETTY_FUNCTION__}; with older compilers, the function
|
|
name and following colon are omitted.
|
|
|
|
If the preprocessor macro @code{NDEBUG} is defined before
|
|
@file{assert.h} is included, the @code{assert} macro is defined to do
|
|
absolutely nothing.
|
|
|
|
@strong{Warning:} Even the argument expression @var{expression} is not
|
|
evaluated if @code{NDEBUG} is in effect. So never use @code{assert}
|
|
with arguments that involve side effects. For example, @code{assert
|
|
(++i > 0);} is a bad idea, because @code{i} will not be incremented if
|
|
@code{NDEBUG} is defined.
|
|
@end deftypefn
|
|
|
|
Sometimes the ``impossible'' condition you want to check for is an error
|
|
return from an operating system function. Then it is useful to display
|
|
not only where the program crashes, but also what error was returned.
|
|
The @code{assert_perror} macro makes this easy.
|
|
|
|
@comment assert.h
|
|
@comment GNU
|
|
@deftypefn Macro void assert_perror (int @var{errnum})
|
|
Similar to @code{assert}, but verifies that @var{errnum} is zero.
|
|
|
|
If @code{NDEBUG} is not defined, @code{assert_perror} tests the value of
|
|
@var{errnum}. If it is nonzero, @code{assert_perror} aborts the program
|
|
after printing a message of the form:
|
|
|
|
@smallexample
|
|
@file{@var{file}}:@var{linenum}: @var{function}: @var{error text}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
on the standard error stream. The file name, line number, and function
|
|
name are as for @code{assert}. The error text is the result of
|
|
@w{@code{strerror (@var{errnum})}}. @xref{Error Messages}.
|
|
|
|
Like @code{assert}, if @code{NDEBUG} is defined before @file{assert.h}
|
|
is included, the @code{assert_perror} macro does absolutely nothing. It
|
|
does not evaluate the argument, so @var{errnum} should not have any side
|
|
effects. It is best for @var{errnum} to be just a simple variable
|
|
reference; often it will be @code{errno}.
|
|
|
|
This macro is a GNU extension.
|
|
@end deftypefn
|
|
|
|
@strong{Usage note:} The @code{assert} facility is designed for
|
|
detecting @emph{internal inconsistency}; it is not suitable for
|
|
reporting invalid input or improper usage by the @emph{user} of the
|
|
program.
|
|
|
|
The information in the diagnostic messages printed by the @code{assert}
|
|
and @code{assert_perror} macro is intended to help you, the programmer,
|
|
track down the cause of a bug, but is not really useful for telling a user
|
|
of your program why his or her input was invalid or why a command could not
|
|
be carried out. What's more, your program should not abort when given
|
|
invalid input, as @code{assert} would do---it should exit with nonzero
|
|
status (@pxref{Exit Status}) after printing its error messages, or perhaps
|
|
read another command or move on to the next input file.
|
|
|
|
@xref{Error Messages}, for information on printing error messages for
|
|
problems that @emph{do not} represent bugs in the program.
|
|
|
|
|
|
@node Variadic Functions
|
|
@section Variadic Functions
|
|
@cindex variable number of arguments
|
|
@cindex variadic functions
|
|
@cindex optional arguments
|
|
|
|
@w{ISO C} defines a syntax for declaring a function to take a variable
|
|
number or type of arguments. (Such functions are referred to as
|
|
@dfn{varargs functions} or @dfn{variadic functions}.) However, the
|
|
language itself provides no mechanism for such functions to access their
|
|
non-required arguments; instead, you use the variable arguments macros
|
|
defined in @file{stdarg.h}.
|
|
|
|
This section describes how to declare variadic functions, how to write
|
|
them, and how to call them properly.
|
|
|
|
@strong{Compatibility Note:} Many older C dialects provide a similar,
|
|
but incompatible, mechanism for defining functions with variable numbers
|
|
of arguments, using @file{varargs.h}.
|
|
|
|
@menu
|
|
* Why Variadic:: Reasons for making functions take
|
|
variable arguments.
|
|
* How Variadic:: How to define and call variadic functions.
|
|
* Variadic Example:: A complete example.
|
|
@end menu
|
|
|
|
@node Why Variadic
|
|
@subsection Why Variadic Functions are Used
|
|
|
|
Ordinary C functions take a fixed number of arguments. When you define
|
|
a function, you specify the data type for each argument. Every call to
|
|
the function should supply the expected number of arguments, with types
|
|
that can be converted to the specified ones. Thus, if the function
|
|
@samp{foo} is declared with @code{int foo (int, char *);} then you must
|
|
call it with two arguments, a number (any kind will do) and a string
|
|
pointer.
|
|
|
|
But some functions perform operations that can meaningfully accept an
|
|
unlimited number of arguments.
|
|
|
|
In some cases a function can handle any number of values by operating on
|
|
all of them as a block. For example, consider a function that allocates
|
|
a one-dimensional array with @code{malloc} to hold a specified set of
|
|
values. This operation makes sense for any number of values, as long as
|
|
the length of the array corresponds to that number. Without facilities
|
|
for variable arguments, you would have to define a separate function for
|
|
each possible array size.
|
|
|
|
The library function @code{printf} (@pxref{Formatted Output}) is an
|
|
example of another class of function where variable arguments are
|
|
useful. This function prints its arguments (which can vary in type as
|
|
well as number) under the control of a format template string.
|
|
|
|
These are good reasons to define a @dfn{variadic} function which can
|
|
handle as many arguments as the caller chooses to pass.
|
|
|
|
Some functions such as @code{open} take a fixed set of arguments, but
|
|
occasionally ignore the last few. Strict adherence to @w{ISO C} requires
|
|
these functions to be defined as variadic; in practice, however, the GNU
|
|
C compiler and most other C compilers let you define such a function to
|
|
take a fixed set of arguments---the most it can ever use---and then only
|
|
@emph{declare} the function as variadic (or not declare its arguments
|
|
at all!).
|
|
|
|
@node How Variadic
|
|
@subsection How Variadic Functions are Defined and Used
|
|
|
|
Defining and using a variadic function involves three steps:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
@emph{Define} the function as variadic, using an ellipsis
|
|
(@samp{@dots{}}) in the argument list, and using special macros to
|
|
access the variable arguments. @xref{Receiving Arguments}.
|
|
|
|
@item
|
|
@emph{Declare} the function as variadic, using a prototype with an
|
|
ellipsis (@samp{@dots{}}), in all the files which call it.
|
|
@xref{Variadic Prototypes}.
|
|
|
|
@item
|
|
@emph{Call} the function by writing the fixed arguments followed by the
|
|
additional variable arguments. @xref{Calling Variadics}.
|
|
@end itemize
|
|
|
|
@menu
|
|
* Variadic Prototypes:: How to make a prototype for a function
|
|
with variable arguments.
|
|
* Receiving Arguments:: Steps you must follow to access the
|
|
optional argument values.
|
|
* How Many Arguments:: How to decide whether there are more arguments.
|
|
* Calling Variadics:: Things you need to know about calling
|
|
variable arguments functions.
|
|
* Argument Macros:: Detailed specification of the macros
|
|
for accessing variable arguments.
|
|
* Old Varargs:: The pre-ISO way of defining variadic functions.
|
|
@end menu
|
|
|
|
@node Variadic Prototypes
|
|
@subsubsection Syntax for Variable Arguments
|
|
@cindex function prototypes (variadic)
|
|
@cindex prototypes for variadic functions
|
|
@cindex variadic function prototypes
|
|
|
|
A function that accepts a variable number of arguments must be declared
|
|
with a prototype that says so. You write the fixed arguments as usual,
|
|
and then tack on @samp{@dots{}} to indicate the possibility of
|
|
additional arguments. The syntax of @w{ISO C} requires at least one fixed
|
|
argument before the @samp{@dots{}}. For example,
|
|
|
|
@smallexample
|
|
int
|
|
func (const char *a, int b, @dots{})
|
|
@{
|
|
@dots{}
|
|
@}
|
|
@end smallexample
|
|
|
|
@noindent
|
|
defines a function @code{func} which returns an @code{int} and takes two
|
|
required arguments, a @code{const char *} and an @code{int}. These are
|
|
followed by any number of anonymous arguments.
|
|
|
|
@strong{Portability note:} For some C compilers, the last required
|
|
argument must not be declared @code{register} in the function
|
|
definition. Furthermore, this argument's type must be
|
|
@dfn{self-promoting}: that is, the default promotions must not change
|
|
its type. This rules out array and function types, as well as
|
|
@code{float}, @code{char} (whether signed or not) and @w{@code{short int}}
|
|
(whether signed or not). This is actually an @w{ISO C} requirement.
|
|
|
|
@node Receiving Arguments
|
|
@subsubsection Receiving the Argument Values
|
|
@cindex variadic function argument access
|
|
@cindex arguments (variadic functions)
|
|
|
|
Ordinary fixed arguments have individual names, and you can use these
|
|
names to access their values. But optional arguments have no
|
|
names---nothing but @samp{@dots{}}. How can you access them?
|
|
|
|
@pindex stdarg.h
|
|
The only way to access them is sequentially, in the order they were
|
|
written, and you must use special macros from @file{stdarg.h} in the
|
|
following three step process:
|
|
|
|
@enumerate
|
|
@item
|
|
You initialize an argument pointer variable of type @code{va_list} using
|
|
@code{va_start}. The argument pointer when initialized points to the
|
|
first optional argument.
|
|
|
|
@item
|
|
You access the optional arguments by successive calls to @code{va_arg}.
|
|
The first call to @code{va_arg} gives you the first optional argument,
|
|
the next call gives you the second, and so on.
|
|
|
|
You can stop at any time if you wish to ignore any remaining optional
|
|
arguments. It is perfectly all right for a function to access fewer
|
|
arguments than were supplied in the call, but you will get garbage
|
|
values if you try to access too many arguments.
|
|
|
|
@item
|
|
You indicate that you are finished with the argument pointer variable by
|
|
calling @code{va_end}.
|
|
|
|
(In practice, with most C compilers, calling @code{va_end} does nothing.
|
|
This is always true in the GNU C compiler. But you might as well call
|
|
@code{va_end} just in case your program is someday compiled with a peculiar
|
|
compiler.)
|
|
@end enumerate
|
|
|
|
@xref{Argument Macros}, for the full definitions of @code{va_start},
|
|
@code{va_arg} and @code{va_end}.
|
|
|
|
Steps 1 and 3 must be performed in the function that accepts the
|
|
optional arguments. However, you can pass the @code{va_list} variable
|
|
as an argument to another function and perform all or part of step 2
|
|
there.
|
|
|
|
You can perform the entire sequence of three steps multiple times
|
|
within a single function invocation. If you want to ignore the optional
|
|
arguments, you can do these steps zero times.
|
|
|
|
You can have more than one argument pointer variable if you like. You
|
|
can initialize each variable with @code{va_start} when you wish, and
|
|
then you can fetch arguments with each argument pointer as you wish.
|
|
Each argument pointer variable will sequence through the same set of
|
|
argument values, but at its own pace.
|
|
|
|
@strong{Portability note:} With some compilers, once you pass an
|
|
argument pointer value to a subroutine, you must not keep using the same
|
|
argument pointer value after that subroutine returns. For full
|
|
portability, you should just pass it to @code{va_end}. This is actually
|
|
an @w{ISO C} requirement, but most ANSI C compilers work happily
|
|
regardless.
|
|
|
|
@node How Many Arguments
|
|
@subsubsection How Many Arguments Were Supplied
|
|
@cindex number of arguments passed
|
|
@cindex how many arguments
|
|
@cindex arguments, how many
|
|
|
|
There is no general way for a function to determine the number and type
|
|
of the optional arguments it was called with. So whoever designs the
|
|
function typically designs a convention for the caller to specify the number
|
|
and type of arguments. It is up to you to define an appropriate calling
|
|
convention for each variadic function, and write all calls accordingly.
|
|
|
|
One kind of calling convention is to pass the number of optional
|
|
arguments as one of the fixed arguments. This convention works provided
|
|
all of the optional arguments are of the same type.
|
|
|
|
A similar alternative is to have one of the required arguments be a bit
|
|
mask, with a bit for each possible purpose for which an optional
|
|
argument might be supplied. You would test the bits in a predefined
|
|
sequence; if the bit is set, fetch the value of the next argument,
|
|
otherwise use a default value.
|
|
|
|
A required argument can be used as a pattern to specify both the number
|
|
and types of the optional arguments. The format string argument to
|
|
@code{printf} is one example of this (@pxref{Formatted Output Functions}).
|
|
|
|
Another possibility is to pass an ``end marker'' value as the last
|
|
optional argument. For example, for a function that manipulates an
|
|
arbitrary number of pointer arguments, a null pointer might indicate the
|
|
end of the argument list. (This assumes that a null pointer isn't
|
|
otherwise meaningful to the function.) The @code{execl} function works
|
|
in just this way; see @ref{Executing a File}.
|
|
|
|
|
|
@node Calling Variadics
|
|
@subsubsection Calling Variadic Functions
|
|
@cindex variadic functions, calling
|
|
@cindex calling variadic functions
|
|
@cindex declaring variadic functions
|
|
|
|
You don't have to do anything special to call a variadic function.
|
|
Just put the arguments (required arguments, followed by optional ones)
|
|
inside parentheses, separated by commas, as usual. But you must declare
|
|
the function with a prototype and know how the argument values are converted.
|
|
|
|
In principle, functions that are @emph{defined} to be variadic must also
|
|
be @emph{declared} to be variadic using a function prototype whenever
|
|
you call them. (@xref{Variadic Prototypes}, for how.) This is because
|
|
some C compilers use a different calling convention to pass the same set
|
|
of argument values to a function depending on whether that function
|
|
takes variable arguments or fixed arguments.
|
|
|
|
In practice, the GNU C compiler always passes a given set of argument
|
|
types in the same way regardless of whether they are optional or
|
|
required. So, as long as the argument types are self-promoting, you can
|
|
safely omit declaring them. Usually it is a good idea to declare the
|
|
argument types for variadic functions, and indeed for all functions.
|
|
But there are a few functions which it is extremely convenient not to
|
|
have to declare as variadic---for example, @code{open} and
|
|
@code{printf}.
|
|
|
|
@cindex default argument promotions
|
|
@cindex argument promotion
|
|
Since the prototype doesn't specify types for optional arguments, in a
|
|
call to a variadic function the @dfn{default argument promotions} are
|
|
performed on the optional argument values. This means the objects of
|
|
type @code{char} or @w{@code{short int}} (whether signed or not) are
|
|
promoted to either @code{int} or @w{@code{unsigned int}}, as
|
|
appropriate; and that objects of type @code{float} are promoted to type
|
|
@code{double}. So, if the caller passes a @code{char} as an optional
|
|
argument, it is promoted to an @code{int}, and the function can access
|
|
it with @code{va_arg (@var{ap}, int)}.
|
|
|
|
Conversion of the required arguments is controlled by the function
|
|
prototype in the usual way: the argument expression is converted to the
|
|
declared argument type as if it were being assigned to a variable of
|
|
that type.
|
|
|
|
@node Argument Macros
|
|
@subsubsection Argument Access Macros
|
|
|
|
Here are descriptions of the macros used to retrieve variable arguments.
|
|
These macros are defined in the header file @file{stdarg.h}.
|
|
@pindex stdarg.h
|
|
|
|
@comment stdarg.h
|
|
@comment ISO
|
|
@deftp {Data Type} va_list
|
|
The type @code{va_list} is used for argument pointer variables.
|
|
@end deftp
|
|
|
|
@comment stdarg.h
|
|
@comment ISO
|
|
@deftypefn {Macro} void va_start (va_list @var{ap}, @var{last-required})
|
|
This macro initializes the argument pointer variable @var{ap} to point
|
|
to the first of the optional arguments of the current function;
|
|
@var{last-required} must be the last required argument to the function.
|
|
|
|
@xref{Old Varargs}, for an alternate definition of @code{va_start}
|
|
found in the header file @file{varargs.h}.
|
|
@end deftypefn
|
|
|
|
@comment stdarg.h
|
|
@comment ISO
|
|
@deftypefn {Macro} @var{type} va_arg (va_list @var{ap}, @var{type})
|
|
The @code{va_arg} macro returns the value of the next optional argument,
|
|
and modifies the value of @var{ap} to point to the subsequent argument.
|
|
Thus, successive uses of @code{va_arg} return successive optional
|
|
arguments.
|
|
|
|
The type of the value returned by @code{va_arg} is @var{type} as
|
|
specified in the call. @var{type} must be a self-promoting type (not
|
|
@code{char} or @code{short int} or @code{float}) that matches the type
|
|
of the actual argument.
|
|
@end deftypefn
|
|
|
|
@comment stdarg.h
|
|
@comment ISO
|
|
@deftypefn {Macro} void va_end (va_list @var{ap})
|
|
This ends the use of @var{ap}. After a @code{va_end} call, further
|
|
@code{va_arg} calls with the same @var{ap} may not work. You should invoke
|
|
@code{va_end} before returning from the function in which @code{va_start}
|
|
was invoked with the same @var{ap} argument.
|
|
|
|
In the GNU C library, @code{va_end} does nothing, and you need not ever
|
|
use it except for reasons of portability.
|
|
@refill
|
|
@end deftypefn
|
|
|
|
Sometimes it is necessary to parse the list of parameters more than once
|
|
or one wants to remember a certain position in the parameter list. To
|
|
do this, one will have to make a copy of the current value of the
|
|
argument. But @code{va_list} is an opaque type and one cannot necessarily
|
|
assign the value of one variable of type @code{va_list} to another variable
|
|
of the same type.
|
|
|
|
@comment stdarg.h
|
|
@comment GNU
|
|
@deftypefn {Macro} void __va_copy (va_list @var{dest}, va_list @var{src})
|
|
The @code{__va_copy} macro allows copying of objects of type
|
|
@code{va_list} even if this is not an integral type. The argument pointer
|
|
in @var{dest} is initialized to point to the same argument as the
|
|
pointer in @var{src}.
|
|
|
|
This macro is a GNU extension but it will hopefully also be available in
|
|
the next update of the ISO C standard.
|
|
@end deftypefn
|
|
|
|
If you want to use @code{__va_copy} you should always be prepared for the
|
|
possibility that this macro will not be available. On architectures where a
|
|
simple assignment is invalid, hopefully @code{__va_copy} @emph{will} be available,
|
|
so one should always write something like this:
|
|
|
|
@smallexample
|
|
@{
|
|
va_list ap, save;
|
|
@dots{}
|
|
#ifdef __va_copy
|
|
__va_copy (save, ap);
|
|
#else
|
|
save = ap;
|
|
#endif
|
|
@dots{}
|
|
@}
|
|
@end smallexample
|
|
|
|
|
|
@node Variadic Example
|
|
@subsection Example of a Variadic Function
|
|
|
|
Here is a complete sample function that accepts a variable number of
|
|
arguments. The first argument to the function is the count of remaining
|
|
arguments, which are added up and the result returned. While trivial,
|
|
this function is sufficient to illustrate how to use the variable
|
|
arguments facility.
|
|
|
|
@comment Yes, this example has been tested.
|
|
@smallexample
|
|
@include add.c.texi
|
|
@end smallexample
|
|
|
|
@node Old Varargs
|
|
@subsubsection Old-Style Variadic Functions
|
|
|
|
@pindex varargs.h
|
|
Before @w{ISO C}, programmers used a slightly different facility for
|
|
writing variadic functions. The GNU C compiler still supports it;
|
|
currently, it is more portable than the @w{ISO C} facility, since support
|
|
for @w{ISO C} is still not universal. The header file which defines the
|
|
old-fashioned variadic facility is called @file{varargs.h}.
|
|
|
|
Using @file{varargs.h} is almost the same as using @file{stdarg.h}.
|
|
There is no difference in how you call a variadic function;
|
|
see @ref{Calling Variadics}. The only difference is in how you define
|
|
them. First of all, you must use old-style non-prototype syntax, like
|
|
this:
|
|
|
|
@smallexample
|
|
tree
|
|
build (va_alist)
|
|
va_dcl
|
|
@{
|
|
@end smallexample
|
|
|
|
Secondly, you must give @code{va_start} only one argument, like this:
|
|
|
|
@smallexample
|
|
va_list p;
|
|
va_start (p);
|
|
@end smallexample
|
|
|
|
These are the special macros used for defining old-style variadic
|
|
functions:
|
|
|
|
@comment varargs.h
|
|
@comment Unix
|
|
@deffn Macro va_alist
|
|
This macro stands for the argument name list required in a variadic
|
|
function.
|
|
@end deffn
|
|
|
|
@comment varargs.h
|
|
@comment Unix
|
|
@deffn Macro va_dcl
|
|
This macro declares the implicit argument or arguments for a variadic
|
|
function.
|
|
@end deffn
|
|
|
|
@comment varargs.h
|
|
@comment Unix
|
|
@deftypefn {Macro} void va_start (va_list @var{ap})
|
|
This macro, as defined in @file{varargs.h}, initializes the argument
|
|
pointer variable @var{ap} to point to the first argument of the current
|
|
function.
|
|
@end deftypefn
|
|
|
|
The other argument macros, @code{va_arg} and @code{va_end}, are the same
|
|
in @file{varargs.h} as in @file{stdarg.h}; see @ref{Argument Macros}, for
|
|
details.
|
|
|
|
It does not work to include both @file{varargs.h} and @file{stdarg.h} in
|
|
the same compilation; they define @code{va_start} in conflicting ways.
|
|
|
|
@node Null Pointer Constant
|
|
@section Null Pointer Constant
|
|
@cindex null pointer constant
|
|
|
|
The null pointer constant is guaranteed not to point to any real object.
|
|
You can assign it to any pointer variable since it has type @code{void
|
|
*}. The preferred way to write a null pointer constant is with
|
|
@code{NULL}.
|
|
|
|
@comment stddef.h
|
|
@comment ISO
|
|
@deftypevr Macro {void *} NULL
|
|
This is a null pointer constant.
|
|
@end deftypevr
|
|
|
|
You can also use @code{0} or @code{(void *)0} as a null pointer
|
|
constant, but using @code{NULL} is cleaner because it makes the purpose
|
|
of the constant more evident.
|
|
|
|
If you use the null pointer constant as a function argument, then for
|
|
complete portability you should make sure that the function has a
|
|
prototype declaration. Otherwise, if the target machine has two
|
|
different pointer representations, the compiler won't know which
|
|
representation to use for that argument. You can avoid the problem by
|
|
explicitly casting the constant to the proper pointer type, but we
|
|
recommend instead adding a prototype for the function you are calling.
|
|
|
|
@node Important Data Types
|
|
@section Important Data Types
|
|
|
|
The result of subtracting two pointers in C is always an integer, but the
|
|
precise data type varies from C compiler to C compiler. Likewise, the
|
|
data type of the result of @code{sizeof} also varies between compilers.
|
|
ISO defines standard aliases for these two types, so you can refer to
|
|
them in a portable fashion. They are defined in the header file
|
|
@file{stddef.h}.
|
|
@pindex stddef.h
|
|
|
|
@comment stddef.h
|
|
@comment ISO
|
|
@deftp {Data Type} ptrdiff_t
|
|
This is the signed integer type of the result of subtracting two
|
|
pointers. For example, with the declaration @code{char *p1, *p2;}, the
|
|
expression @code{p2 - p1} is of type @code{ptrdiff_t}. This will
|
|
probably be one of the standard signed integer types (@w{@code{short
|
|
int}}, @code{int} or @w{@code{long int}}), but might be a nonstandard
|
|
type that exists only for this purpose.
|
|
@end deftp
|
|
|
|
@comment stddef.h
|
|
@comment ISO
|
|
@deftp {Data Type} size_t
|
|
This is an unsigned integer type used to represent the sizes of objects.
|
|
The result of the @code{sizeof} operator is of this type, and functions
|
|
such as @code{malloc} (@pxref{Unconstrained Allocation}) and
|
|
@code{memcpy} (@pxref{Copying and Concatenation}) accept arguments of
|
|
this type to specify object sizes.
|
|
|
|
@strong{Usage Note:} @code{size_t} is the preferred way to declare any
|
|
arguments or variables that hold the size of an object.
|
|
@end deftp
|
|
|
|
In the GNU system @code{size_t} is equivalent to either
|
|
@w{@code{unsigned int}} or @w{@code{unsigned long int}}. These types
|
|
have identical properties on the GNU system and, for most purposes, you
|
|
can use them interchangeably. However, they are distinct as data types,
|
|
which makes a difference in certain contexts.
|
|
|
|
For example, when you specify the type of a function argument in a
|
|
function prototype, it makes a difference which one you use. If the
|
|
system header files declare @code{malloc} with an argument of type
|
|
@code{size_t} and you declare @code{malloc} with an argument of type
|
|
@code{unsigned int}, you will get a compilation error if @code{size_t}
|
|
happens to be @code{unsigned long int} on your system. To avoid any
|
|
possibility of error, when a function argument or value is supposed to
|
|
have type @code{size_t}, never declare its type in any other way.
|
|
|
|
@strong{Compatibility Note:} Implementations of C before the advent of
|
|
@w{ISO C} generally used @code{unsigned int} for representing object sizes
|
|
and @code{int} for pointer subtraction results. They did not
|
|
necessarily define either @code{size_t} or @code{ptrdiff_t}. Unix
|
|
systems did define @code{size_t}, in @file{sys/types.h}, but the
|
|
definition was usually a signed type.
|
|
|
|
@node Data Type Measurements
|
|
@section Data Type Measurements
|
|
|
|
Most of the time, if you choose the proper C data type for each object
|
|
in your program, you need not be concerned with just how it is
|
|
represented or how many bits it uses. When you do need such
|
|
information, the C language itself does not provide a way to get it.
|
|
The header files @file{limits.h} and @file{float.h} contain macros
|
|
which give you this information in full detail.
|
|
|
|
@menu
|
|
* Width of Type:: How many bits does an integer type hold?
|
|
* Range of Type:: What are the largest and smallest values
|
|
that an integer type can hold?
|
|
* Floating Type Macros:: Parameters that measure the floating point types.
|
|
* Structure Measurement:: Getting measurements on structure types.
|
|
@end menu
|
|
|
|
@node Width of Type
|
|
@subsection Computing the Width of an Integer Data Type
|
|
@cindex integer type width
|
|
@cindex width of integer type
|
|
@cindex type measurements, integer
|
|
|
|
The most common reason that a program needs to know how many bits are in
|
|
an integer type is for using an array of @code{long int} as a bit vector.
|
|
You can access the bit at index @var{n} with
|
|
|
|
@smallexample
|
|
vector[@var{n} / LONGBITS] & (1 << (@var{n} % LONGBITS))
|
|
@end smallexample
|
|
|
|
@noindent
|
|
provided you define @code{LONGBITS} as the number of bits in a
|
|
@code{long int}.
|
|
|
|
@pindex limits.h
|
|
There is no operator in the C language that can give you the number of
|
|
bits in an integer data type. But you can compute it from the macro
|
|
@code{CHAR_BIT}, defined in the header file @file{limits.h}.
|
|
|
|
@table @code
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item CHAR_BIT
|
|
This is the number of bits in a @code{char}---eight, on most systems.
|
|
The value has type @code{int}.
|
|
|
|
You can compute the number of bits in any data type @var{type} like
|
|
this:
|
|
|
|
@smallexample
|
|
sizeof (@var{type}) * CHAR_BIT
|
|
@end smallexample
|
|
@end table
|
|
|
|
@node Range of Type
|
|
@subsection Range of an Integer Type
|
|
@cindex integer type range
|
|
@cindex range of integer type
|
|
@cindex limits, integer types
|
|
|
|
Suppose you need to store an integer value which can range from zero to
|
|
one million. Which is the smallest type you can use? There is no
|
|
general rule; it depends on the C compiler and target machine. You can
|
|
use the @samp{MIN} and @samp{MAX} macros in @file{limits.h} to determine
|
|
which type will work.
|
|
|
|
Each signed integer type has a pair of macros which give the smallest
|
|
and largest values that it can hold. Each unsigned integer type has one
|
|
such macro, for the maximum value; the minimum value is, of course,
|
|
zero.
|
|
|
|
The values of these macros are all integer constant expressions. The
|
|
@samp{MAX} and @samp{MIN} macros for @code{char} and @w{@code{short
|
|
int}} types have values of type @code{int}. The @samp{MAX} and
|
|
@samp{MIN} macros for the other types have values of the same type
|
|
described by the macro---thus, @code{ULONG_MAX} has type
|
|
@w{@code{unsigned long int}}.
|
|
|
|
@comment Extra blank lines make it look better.
|
|
@vtable @code
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item SCHAR_MIN
|
|
|
|
This is the minimum value that can be represented by a @w{@code{signed char}}.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item SCHAR_MAX
|
|
@comment limits.h
|
|
@comment ISO
|
|
@itemx UCHAR_MAX
|
|
|
|
These are the maximum values that can be represented by a
|
|
@w{@code{signed char}} and @w{@code{unsigned char}}, respectively.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item CHAR_MIN
|
|
|
|
This is the minimum value that can be represented by a @code{char}.
|
|
It's equal to @code{SCHAR_MIN} if @code{char} is signed, or zero
|
|
otherwise.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item CHAR_MAX
|
|
|
|
This is the maximum value that can be represented by a @code{char}.
|
|
It's equal to @code{SCHAR_MAX} if @code{char} is signed, or
|
|
@code{UCHAR_MAX} otherwise.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item SHRT_MIN
|
|
|
|
This is the minimum value that can be represented by a @w{@code{signed
|
|
short int}}. On most machines that the GNU C library runs on,
|
|
@code{short} integers are 16-bit quantities.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item SHRT_MAX
|
|
@comment limits.h
|
|
@comment ISO
|
|
@itemx USHRT_MAX
|
|
|
|
These are the maximum values that can be represented by a
|
|
@w{@code{signed short int}} and @w{@code{unsigned short int}},
|
|
respectively.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item INT_MIN
|
|
|
|
This is the minimum value that can be represented by a @w{@code{signed
|
|
int}}. On most machines that the GNU C system runs on, an @code{int} is
|
|
a 32-bit quantity.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item INT_MAX
|
|
@comment limits.h
|
|
@comment ISO
|
|
@itemx UINT_MAX
|
|
|
|
These are the maximum values that can be represented by, respectively,
|
|
the type @w{@code{signed int}} and the type @w{@code{unsigned int}}.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item LONG_MIN
|
|
|
|
This is the minimum value that can be represented by a @w{@code{signed
|
|
long int}}. On most machines that the GNU C system runs on, @code{long}
|
|
integers are 32-bit quantities, the same size as @code{int}.
|
|
|
|
@comment limits.h
|
|
@comment ISO
|
|
@item LONG_MAX
|
|
@comment limits.h
|
|
@comment ISO
|
|
@itemx ULONG_MAX
|
|
|
|
These are the maximum values that can be represented by a
|
|
@w{@code{signed long int}} and @code{unsigned long int}, respectively.
|
|
|
|
@comment limits.h
|
|
@comment GNU
|
|
@item LONG_LONG_MIN
|
|
|
|
This is the minimum value that can be represented by a @w{@code{signed
|
|
long long int}}. On most machines that the GNU C system runs on,
|
|
@w{@code{long long}} integers are 64-bit quantities.
|
|
|
|
@comment limits.h
|
|
@comment GNU
|
|
@item LONG_LONG_MAX
|
|
@comment limits.h
|
|
@comment ISO
|
|
@itemx ULONG_LONG_MAX
|
|
|
|
These are the maximum values that can be represented by a @code{signed
|
|
long long int} and @code{unsigned long long int}, respectively.
|
|
|
|
@comment limits.h
|
|
@comment GNU
|
|
@item WCHAR_MAX
|
|
|
|
This is the maximum value that can be represented by a @code{wchar_t}.
|
|
@xref{Extended Char Intro}.
|
|
@end vtable
|
|
|
|
The header file @file{limits.h} also defines some additional constants
|
|
that parameterize various operating system and file system limits. These
|
|
constants are described in @ref{System Configuration}.
|
|
|
|
@node Floating Type Macros
|
|
@subsection Floating Type Macros
|
|
@cindex floating type measurements
|
|
@cindex measurements of floating types
|
|
@cindex type measurements, floating
|
|
@cindex limits, floating types
|
|
|
|
The specific representation of floating point numbers varies from
|
|
machine to machine. Because floating point numbers are represented
|
|
internally as approximate quantities, algorithms for manipulating
|
|
floating point data often need to take account of the precise details of
|
|
the machine's floating point representation.
|
|
|
|
Some of the functions in the C library itself need this information; for
|
|
example, the algorithms for printing and reading floating point numbers
|
|
(@pxref{I/O on Streams}) and for calculating trigonometric and
|
|
irrational functions (@pxref{Mathematics}) use it to avoid round-off
|
|
error and loss of accuracy. User programs that implement numerical
|
|
analysis techniques also often need this information in order to
|
|
minimize or compute error bounds.
|
|
|
|
The header file @file{float.h} describes the format used by your
|
|
machine.
|
|
|
|
@menu
|
|
* Floating Point Concepts:: Definitions of terminology.
|
|
* Floating Point Parameters:: Details of specific macros.
|
|
* IEEE Floating Point:: The measurements for one common
|
|
representation.
|
|
@end menu
|
|
|
|
@node Floating Point Concepts
|
|
@subsubsection Floating Point Representation Concepts
|
|
|
|
This section introduces the terminology for describing floating point
|
|
representations.
|
|
|
|
You are probably already familiar with most of these concepts in terms
|
|
of scientific or exponential notation for floating point numbers. For
|
|
example, the number @code{123456.0} could be expressed in exponential
|
|
notation as @code{1.23456e+05}, a shorthand notation indicating that the
|
|
mantissa @code{1.23456} is multiplied by the base @code{10} raised to
|
|
power @code{5}.
|
|
|
|
More formally, the internal representation of a floating point number
|
|
can be characterized in terms of the following parameters:
|
|
|
|
@itemize @bullet
|
|
@item
|
|
@cindex sign (of floating point number)
|
|
The @dfn{sign} is either @code{-1} or @code{1}.
|
|
|
|
@item
|
|
@cindex base (of floating point number)
|
|
@cindex radix (of floating point number)
|
|
The @dfn{base} or @dfn{radix} for exponentiation, an integer greater
|
|
than @code{1}. This is a constant for a particular representation.
|
|
|
|
@item
|
|
@cindex exponent (of floating point number)
|
|
The @dfn{exponent} to which the base is raised. The upper and lower
|
|
bounds of the exponent value are constants for a particular
|
|
representation.
|
|
|
|
@cindex bias (of floating point number exponent)
|
|
Sometimes, in the actual bits representing the floating point number,
|
|
the exponent is @dfn{biased} by adding a constant to it, to make it
|
|
always be represented as an unsigned quantity. This is only important
|
|
if you have some reason to pick apart the bit fields making up the
|
|
floating point number by hand, which is something for which the GNU
|
|
library provides no support. So this is ignored in the discussion that
|
|
follows.
|
|
|
|
@item
|
|
@cindex mantissa (of floating point number)
|
|
@cindex significand (of floating point number)
|
|
The @dfn{mantissa} or @dfn{significand} is an unsigned integer which is a
|
|
part of each floating point number.
|
|
|
|
@item
|
|
@cindex precision (of floating point number)
|
|
The @dfn{precision} of the mantissa. If the base of the representation
|
|
is @var{b}, then the precision is the number of base-@var{b} digits in
|
|
the mantissa. This is a constant for a particular representation.
|
|
|
|
@cindex hidden bit (of floating point number mantissa)
|
|
Many floating point representations have an implicit @dfn{hidden bit} in
|
|
the mantissa. This is a bit which is present virtually in the mantissa,
|
|
but not stored in memory because its value is always 1 in a normalized
|
|
number. The precision figure (see above) includes any hidden bits.
|
|
|
|
Again, the GNU library provides no facilities for dealing with such
|
|
low-level aspects of the representation.
|
|
@end itemize
|
|
|
|
The mantissa of a floating point number represents an implicit fraction
|
|
whose denominator is the base raised to the power of the precision. Since
|
|
the largest representable mantissa is one less than this denominator, the
|
|
value of the fraction is always strictly less than @code{1}. The
|
|
mathematical value of a floating point number is then the product of this
|
|
fraction, the sign, and the base raised to the exponent.
|
|
|
|
@cindex normalized floating point number
|
|
We say that the floating point number is @dfn{normalized} if the
|
|
fraction is at least @code{1/@var{b}}, where @var{b} is the base. In
|
|
other words, the mantissa would be too large to fit if it were
|
|
multiplied by the base. Non-normalized numbers are sometimes called
|
|
@dfn{denormal}; they contain less precision than the representation
|
|
normally can hold.
|
|
|
|
If the number is not normalized, then you can subtract @code{1} from the
|
|
exponent while multiplying the mantissa by the base, and get another
|
|
floating point number with the same value. @dfn{Normalization} consists
|
|
of doing this repeatedly until the number is normalized. Two distinct
|
|
normalized floating point numbers cannot be equal in value.
|
|
|
|
(There is an exception to this rule: if the mantissa is zero, it is
|
|
considered normalized. Another exception happens on certain machines
|
|
where the exponent is as small as the representation can hold. Then
|
|
it is impossible to subtract @code{1} from the exponent, so a number
|
|
may be normalized even if its fraction is less than @code{1/@var{b}}.)
|
|
|
|
@node Floating Point Parameters
|
|
@subsubsection Floating Point Parameters
|
|
|
|
@pindex float.h
|
|
These macro definitions can be accessed by including the header file
|
|
@file{float.h} in your program.
|
|
|
|
Macro names starting with @samp{FLT_} refer to the @code{float} type,
|
|
while names beginning with @samp{DBL_} refer to the @code{double} type
|
|
and names beginning with @samp{LDBL_} refer to the @code{long double}
|
|
type. (If GCC does not support @code{long double} as a distinct data
|
|
type on a target machine then the values for the @samp{LDBL_} constants
|
|
are equal to the corresponding constants for the @code{double} type.)
|
|
|
|
Of these macros, only @code{FLT_RADIX} is guaranteed to be a constant
|
|
expression. The other macros listed here cannot be reliably used in
|
|
places that require constant expressions, such as @samp{#if}
|
|
preprocessing directives or in the dimensions of static arrays.
|
|
|
|
Although the @w{ISO C} standard specifies minimum and maximum values for
|
|
most of these parameters, the GNU C implementation uses whatever values
|
|
describe the floating point representation of the target machine. So in
|
|
principle GNU C actually satisfies the @w{ISO C} requirements only if the
|
|
target machine is suitable. In practice, all the machines currently
|
|
supported are suitable.
|
|
|
|
@vtable @code
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_ROUNDS
|
|
This value characterizes the rounding mode for floating point addition.
|
|
The following values indicate standard rounding modes:
|
|
|
|
@need 750
|
|
|
|
@table @code
|
|
@item -1
|
|
The mode is indeterminable.
|
|
@item 0
|
|
Rounding is towards zero.
|
|
@item 1
|
|
Rounding is to the nearest number.
|
|
@item 2
|
|
Rounding is towards positive infinity.
|
|
@item 3
|
|
Rounding is towards negative infinity.
|
|
@end table
|
|
|
|
@noindent
|
|
Any other value represents a machine-dependent nonstandard rounding
|
|
mode.
|
|
|
|
On most machines, the value is @code{1}, in accordance with the IEEE
|
|
standard for floating point.
|
|
|
|
Here is a table showing how certain values round for each possible value
|
|
of @code{FLT_ROUNDS}, if the other aspects of the representation match
|
|
the IEEE single-precision standard.
|
|
|
|
@smallexample
|
|
0 1 2 3
|
|
1.00000003 1.0 1.0 1.00000012 1.0
|
|
1.00000007 1.0 1.00000012 1.00000012 1.0
|
|
-1.00000003 -1.0 -1.0 -1.0 -1.00000012
|
|
-1.00000007 -1.0 -1.00000012 -1.0 -1.00000012
|
|
@end smallexample
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_RADIX
|
|
This is the value of the base, or radix, of the exponent representation.
|
|
This is guaranteed to be a constant expression, unlike the other macros
|
|
described in this section. The value is 2 on all machines we know of
|
|
except the IBM 360 and derivatives.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_MANT_DIG
|
|
This is the number of base-@code{FLT_RADIX} digits in the floating point
|
|
mantissa for the @code{float} data type. The following expression
|
|
yields @code{1.0} (even though mathematically it should not) due to the
|
|
limited number of mantissa digits:
|
|
|
|
@smallexample
|
|
float radix = FLT_RADIX;
|
|
|
|
1.0f + 1.0f / radix / radix / @dots{} / radix
|
|
@end smallexample
|
|
|
|
@noindent
|
|
where @code{radix} appears @code{FLT_MANT_DIG} times.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_MANT_DIG
|
|
@itemx LDBL_MANT_DIG
|
|
This is the number of base-@code{FLT_RADIX} digits in the floating point
|
|
mantissa for the data types @code{double} and @code{long double},
|
|
respectively.
|
|
|
|
@comment Extra blank lines make it look better.
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_DIG
|
|
|
|
This is the number of decimal digits of precision for the @code{float}
|
|
data type. Technically, if @var{p} and @var{b} are the precision and
|
|
base (respectively) for the representation, then the decimal precision
|
|
@var{q} is the maximum number of decimal digits such that any floating
|
|
point number with @var{q} base 10 digits can be rounded to a floating
|
|
point number with @var{p} base @var{b} digits and back again, without
|
|
change to the @var{q} decimal digits.
|
|
|
|
The value of this macro is supposed to be at least @code{6}, to satisfy
|
|
@w{ISO C}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_DIG
|
|
@itemx LDBL_DIG
|
|
|
|
These are similar to @code{FLT_DIG}, but for the data types
|
|
@code{double} and @code{long double}, respectively. The values of these
|
|
macros are supposed to be at least @code{10}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_MIN_EXP
|
|
This is the smallest possible exponent value for type @code{float}.
|
|
More precisely, is the minimum negative integer such that the value
|
|
@code{FLT_RADIX} raised to this power minus 1 can be represented as a
|
|
normalized floating point number of type @code{float}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_MIN_EXP
|
|
@itemx LDBL_MIN_EXP
|
|
|
|
These are similar to @code{FLT_MIN_EXP}, but for the data types
|
|
@code{double} and @code{long double}, respectively.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_MIN_10_EXP
|
|
This is the minimum negative integer such that @code{10} raised to this
|
|
power minus 1 can be represented as a normalized floating point number
|
|
of type @code{float}. This is supposed to be @code{-37} or even less.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_MIN_10_EXP
|
|
@itemx LDBL_MIN_10_EXP
|
|
These are similar to @code{FLT_MIN_10_EXP}, but for the data types
|
|
@code{double} and @code{long double}, respectively.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_MAX_EXP
|
|
This is the largest possible exponent value for type @code{float}. More
|
|
precisely, this is the maximum positive integer such that value
|
|
@code{FLT_RADIX} raised to this power minus 1 can be represented as a
|
|
floating point number of type @code{float}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_MAX_EXP
|
|
@itemx LDBL_MAX_EXP
|
|
These are similar to @code{FLT_MAX_EXP}, but for the data types
|
|
@code{double} and @code{long double}, respectively.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_MAX_10_EXP
|
|
This is the maximum positive integer such that @code{10} raised to this
|
|
power minus 1 can be represented as a normalized floating point number
|
|
of type @code{float}. This is supposed to be at least @code{37}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_MAX_10_EXP
|
|
@itemx LDBL_MAX_10_EXP
|
|
These are similar to @code{FLT_MAX_10_EXP}, but for the data types
|
|
@code{double} and @code{long double}, respectively.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_MAX
|
|
|
|
The value of this macro is the maximum number representable in type
|
|
@code{float}. It is supposed to be at least @code{1E+37}. The value
|
|
has type @code{float}.
|
|
|
|
The smallest representable number is @code{- FLT_MAX}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_MAX
|
|
@itemx LDBL_MAX
|
|
|
|
These are similar to @code{FLT_MAX}, but for the data types
|
|
@code{double} and @code{long double}, respectively. The type of the
|
|
macro's value is the same as the type it describes.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_MIN
|
|
|
|
The value of this macro is the minimum normalized positive floating
|
|
point number that is representable in type @code{float}. It is supposed
|
|
to be no more than @code{1E-37}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_MIN
|
|
@itemx LDBL_MIN
|
|
|
|
These are similar to @code{FLT_MIN}, but for the data types
|
|
@code{double} and @code{long double}, respectively. The type of the
|
|
macro's value is the same as the type it describes.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item FLT_EPSILON
|
|
|
|
This is the minimum positive floating point number of type @code{float}
|
|
such that @code{1.0 + FLT_EPSILON != 1.0} is true. It's supposed to
|
|
be no greater than @code{1E-5}.
|
|
|
|
@comment float.h
|
|
@comment ISO
|
|
@item DBL_EPSILON
|
|
@itemx LDBL_EPSILON
|
|
|
|
These are similar to @code{FLT_EPSILON}, but for the data types
|
|
@code{double} and @code{long double}, respectively. The type of the
|
|
macro's value is the same as the type it describes. The values are not
|
|
supposed to be greater than @code{1E-9}.
|
|
@end vtable
|
|
|
|
@node IEEE Floating Point
|
|
@subsubsection IEEE Floating Point
|
|
@cindex IEEE floating point representation
|
|
@cindex floating point, IEEE
|
|
|
|
Here is an example showing how the floating type measurements come out
|
|
for the most common floating point representation, specified by the
|
|
@cite{IEEE Standard for Binary Floating Point Arithmetic (ANSI/IEEE Std
|
|
754-1985)}. Nearly all computers designed since the 1980s use this
|
|
format.
|
|
|
|
The IEEE single-precision float representation uses a base of 2. There
|
|
is a sign bit, a mantissa with 23 bits plus one hidden bit (so the total
|
|
precision is 24 base-2 digits), and an 8-bit exponent that can represent
|
|
values in the range -125 to 128, inclusive.
|
|
|
|
So, for an implementation that uses this representation for the
|
|
@code{float} data type, appropriate values for the corresponding
|
|
parameters are:
|
|
|
|
@smallexample
|
|
FLT_RADIX 2
|
|
FLT_MANT_DIG 24
|
|
FLT_DIG 6
|
|
FLT_MIN_EXP -125
|
|
FLT_MIN_10_EXP -37
|
|
FLT_MAX_EXP 128
|
|
FLT_MAX_10_EXP +38
|
|
FLT_MIN 1.17549435E-38F
|
|
FLT_MAX 3.40282347E+38F
|
|
FLT_EPSILON 1.19209290E-07F
|
|
@end smallexample
|
|
|
|
Here are the values for the @code{double} data type:
|
|
|
|
@smallexample
|
|
DBL_MANT_DIG 53
|
|
DBL_DIG 15
|
|
DBL_MIN_EXP -1021
|
|
DBL_MIN_10_EXP -307
|
|
DBL_MAX_EXP 1024
|
|
DBL_MAX_10_EXP 308
|
|
DBL_MAX 1.7976931348623157E+308
|
|
DBL_MIN 2.2250738585072014E-308
|
|
DBL_EPSILON 2.2204460492503131E-016
|
|
@end smallexample
|
|
|
|
@node Structure Measurement
|
|
@subsection Structure Field Offset Measurement
|
|
|
|
You can use @code{offsetof} to measure the location within a structure
|
|
type of a particular structure member.
|
|
|
|
@comment stddef.h
|
|
@comment ISO
|
|
@deftypefn {Macro} size_t offsetof (@var{type}, @var{member})
|
|
This expands to a integer constant expression that is the offset of the
|
|
structure member named @var{member} in the structure type @var{type}.
|
|
For example, @code{offsetof (struct s, elem)} is the offset, in bytes,
|
|
of the member @code{elem} in a @code{struct s}.
|
|
|
|
This macro won't work if @var{member} is a bit field; you get an error
|
|
from the C compiler in that case.
|
|
@end deftypefn
|