[Info-vax] C99 updates to CRTL
Craig A. Berry
craigberry at nospam.mac.com
Sat Jul 27 09:53:04 EDT 2019
On 7/20/19 3:56 AM, Jan-Erik Söderholm wrote:
> VMS Software, Inc. is pleased to announce enhancements and updates
> to the C Run Time Library to provide support for C99 Standard
> functions which were not previously available.
stdint.h is there, though I have not looked carefully at its contents.
fpclassify appears to work as advertised, but I have not looked into
other math.h functions. However, isblank does not work as advertised,
and I stopped looking further when I realized what's up with isblank.
The docs that come with the C99 CRTL update says the following regarding
all the new functions:
------
To utilize these functions, compile your applications with the
/STANDARD=C99, /STANDARD=LATEST or /STANDARD=RELAXED (default)
switches.
------
So one would reasonably expect that any of these switches would be
sufficient to get the new functions. But it isn't true. Here is a
little test program:
$ type test_isblank.c
#include <ctype.h>
int main() {
int c = ' ';
if (isblank(c))
return 0 ;
else
return 1 ;
}
Compiling with the default (equivalent to /STANDARD=RELAXED_ANSI) gives:
$ cc test_isblank
if (isblank(c))
............^
%CC-I-IMPLICITFUNC, In this statement, the identifier "isblank" is
implicitly declared as a function.
at line number 4 in file D0:[craig.TEST]test_isblank.c;1
So while that's "only" an informational message, the prototype is hidden
and no self-respecting configuration probe will end up deciding that the
isblank function exists in the C library.
Compiling with /STANDARD=C99 does work:
$ cc/standard=c99 test_isblank
The documentation under HELP CC/STANDARD says:
-----
C99 is a superset of Amendment 1 to the C89 standard, and the default
mode of RELAXED is a superset of C99.
-----
and yet the actual implementation of RELAXED for the new functions is
now a subset, not a superset, of C99.
A hint about what's wrong is visible from a listing snippet from
compiling with the relaxed standard:
I1 X 566 #if defined(__DECC) && (__DECC_VER >= 60400000) &&
(__STDC_VERSION__ >= 199901L) && defined(_ANSI_C_SOURCE) /* C99 *
I1 X 566 /
I1 X 567 int isblank (int);
I1 X 568 #endif
The _ANSI_C_SOURCE requirement is what hides this function and setting
that macro explicitly does get the example to compile without warnings:
$ cc/define="_ANSI_C_SOURCE" test_isblank
However, defining that breaks a ton of things. It disables all DEC C
extensions, such as the optional RMS arguments to the standard I/O
functions, and hides lots of functions that are de facto standards but
not specified by ANSI, such as setjmp and strnlen (to name only two I
stumbled across in a quick look around the headers). pthread.h says,
"_ANSI_C_SOURCE (ANSI C) will disable thread support." Ouch.
Needless to say, it's a bit disappointing after waiting so long for C99
support to be completed that it got delivered in a form that is not
actually workable in the real world.
More information about the Info-vax
mailing list