Keith Thompson <
Keith.S.Thompson+u@gmail.com> writes:
Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
antispam@fricas.org (Waldek Hebisch) writes:
Tim Rentsch <tr.17687@z991.linuxsc.com> wrote:
James Kuyper <jameskuyper@alumni.caltech.edu> writes:
[...]
Note: in C2023, the [predefined macro names] section says: "Any
other predefined macro names: shall begin with a leading
underscore followed by an uppercase letter; or, a second
underscore...". For earlier versions of the standard, user code
should avoid using such identifiers because they were reserved
for all purposes, but that's no longer the case. Now, they
should be avoided because they may be pre-defined by the
implementation, which means that any attempt to use them might
have unpredictable results.
That's right in the sense that if the implementation is unknown
then unexpected results may occur. However, if the
implementation is known, then we can find out what results are
expected by consulting the implementation's documentation for
extensions, since any such macro name must qualify as an
extension, and so much be documented.
Hmm, looking at '/usr/include/string.h' on my machine I see
definitions of things like
__GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
__need_size_t
and lot of similar things. I do not recall seeing any user
documentation listing them. Does this mean that gcc+glibc
is noncompilant in this aspect?
I think it's reasonable to say that the appearance of a macro
name being #define'd in a standard header qualifies as
documenting the name being #define'd.
I disagree. I don't think it's reasonable to say that.
Some people think it's reasonable. It's okay if you don't.
Headers are not documentation. They're often barely human-readable,
and the system headers aren't necessarily even files.
Yes, I might have said "standard header file", with the
understanding that the files in question are encoded in regular
ascii. There isn't any requirement that the document(s) be easy
to read.
As long as the #define is
readable in an ordinary source file, there isn't any mystery
about the name being used or what its definition is.
System headers can be arbitrarily complex, with #includes for other system-specific headers, nests of #ifs and #ifdefs, and so on.
As long as they define all implementation-defined characteristics
(and I suppose can be understood by humans), how complex they are
doesn't matter. That's a QOI issue, not a conformance issue.
I suppose
that to satisfy the letter of the C standard, the accompanying
document would need to incorporate the system header files by
reference, but surely the header files satisfy the spirit of
providing the required documentation. Implementation-defined
values for things like CHAR_BIT and INT_MAX fall under the same
rule for documentation as do extensions, yet as far as I know
these values are defined only in system header files, and not in
any separate document.
gcc's documentation does have a "C Implementation-Defined Behavior"
section. It doesn't mention CHAR_BIT by name, but it does document
"The number of bits in a byte" as "Determined by ABI". I didn't
find anything similar for INT_MAX.
I find it implausible that the standard intended to require
implementations to document all macros defined in standard headers,
The language in the C standard is clearcut: "An implementation shall
be accompanied by a document that defines all implementation-defined
and locale-specified characteristics and all extensions." If gcc
(together with glibc) doesn't provide such a document, that defines
ALL implementation-defined characteristics, etc, and system header
files don't count, then that implementation is not conforming. See
also my followup to James Kuyper in a closely related sub-thread.
--- PyGate Linux v1.5.2
* Origin: Dragon's Lair, PyGate NNTP<>Fido Gate (3:633/10)