octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: isascii/toascii with MSVC


From: Michael Goffioul
Subject: Re: isascii/toascii with MSVC
Date: Mon, 25 Feb 2008 10:04:04 +0100

On Mon, Feb 25, 2008 at 7:38 AM, John W. Eaton <address@hidden> wrote:
> Even with the #undef toascii, you still need to use __toascii to get
> the function instead of the macro?  I don't think that conforms to the
> C langauge standard.

You don't expect MSVC to look for 100% standard compliancy, don't you?
:-)

In my previous mail, I was slightly wrong when using ANSI C. Actually, a
trend in MSVC is not being C (especially C99) compliant, because there
are other possible implementation in ISO C++; typical example is the
Complex C99 keyword: I don't think MSVC will ever support it because
you can do complex already in C++.

When you look at MSVC documentation, it's stated that toascii is
deprecated, in favour of the ISO C++ __toascii. If you look in the header,
the actual function declared is __toascii. Then you have a

#define toascii __toascii

This definition is conditional to __STDC__ not being defined
(that is, if __STDC__ is defined, you don't even get toascii).

> What happens for the following if you compile it as a C program?
>
> #include <stdio.h>
> #include <ctype.h>
> #undef toascii
>
> int
> main (void)
> {
>  typedef int (*fptr) (int);
>  char c = '*';
>  int i;
>  fptr f = toascii;
>  i = (*f) (c);
>  printf ("%c: %d\n", c, i);
>  return 0;
> }
>
> Does that fail because toascii is undefined?

Obviously, with what I've said before, this fails to compile.

> I think this is supposed to be one of the accepted ways to avoid
> macros defined in ctype.h and use the functions instead, so I would
> expect it to work.

MSVC implements the function/macro duality with __isascii/__toascii,
not with isascii/toascii. So basically, what you have is:

extern int __toascii (int c);

#define __toascii(c) ...

#define toascii __toascii

This weirdness was easy to work around when isascii/toascii were
only used locally in src/mappers.cc. Now that they are used in various
headers, it's much more tricky.

Michael.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]