467,892 Members | 1,879 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 467,892 developers. It's quick & easy.

Syntax error?

Looking over some code I came across a line like this

if isalnum((unsigned char)c) {

which was accepted by the compiler without complaint. Should the
compiler have issued a diagnostic in this case? (I think it's not
required to, but I'd like confirmation).

Jeremy.
Nov 13 '05 #1
  • viewed: 3533
Share:
4 Replies
In article <bn************@ID-114079.news.uni-berlin.de>,
Jeremy Yallop <je****@jdyallop.freeserve.co.uk> wrote:
Looking over some code I came across a line like this

if isalnum((unsigned char)c) {

which was accepted by the compiler without complaint. Should the
compiler have issued a diagnostic in this case? (I think it's not
required to, but I'd like confirmation).


isalnum probably expands to something that's wrapped with parens.
F'rexample, on a random system readily accessible to me:
--------
dave@hct-cvs:~/clc (0) $ cat jy-for-syntax-expand-isalnum.c
#include <ctype.h>
#include <stdio.h>

#define STR(x) STR_(x)
#define STR_(x) #x

int main(void)
{
printf("isalnum(x) expands to %s\n",STR(isalnum(x)));

return 0;
}
dave@hct-cvs:~/clc (0) $ gcc -W -Wall -ansi -pedantic -O -c jy-for-syntax-expand-isalnum.c
dave@hct-cvs:~/clc (0) $ ./a.out
isalnum(x) expands to (__ctype_b[(int) ((x))] & (unsigned short int) _ISalnum)
dave@hct-cvs:~/clc (0) $
--------
so "if isalnum(foo)" would be expanded to
"if (expansion_of_isalnum_with_parens)", which is valid.

If this weren't the case it would be, if I'm not mistaken, a syntax
error that requires a diagnostic. GCC appears to agree with me:
--------
dave@hct-cvs:~/clc (0) $ cat jy-for-syntax-broken-if.c
int bogus_function(int);

#include <stdio.h>

int main(void)
{
if bogus_function(42)
{
puts("bogus_function() returned nonzero");
}

return 0;
}
dave@hct-cvs:~/clc (0) $ gcc -W -Wall -ansi -pedantic -O -c jy-for-syntax-broken-if.c
jy-for-syntax-broken-if.c: In function `main':
jy-for-syntax-broken-if.c:7: parse error before `bogus_function'
jy-for-syntax-broken-if.c:10: warning: control reaches end of non-void function
dave@hct-cvs:~/clc (1) $
--------
dave

--
Dave Vandervies dj******@csclub.uwaterloo.ca
Have some pride, you're a physics major! You know deep in your heart
you're better than the rest of the slobs there, you should be able to
knock this course off easily. --Brian B. Rodenborn in comp.lang.c
Nov 13 '05 #2
Jeremy Yallop wrote:
Looking over some code I came across a line like this

if isalnum((unsigned char)c) {

which was accepted by the compiler without complaint. Should the
compiler have issued a diagnostic in this case? (I think it's not
required to, but I'd like confirmation).


Presumably this is accepted because 'isalnum' is a macro that happens to
have a form that makes the syntax valid. You probably knew that already,
but some people reading might not.

I don't know for sure, but I don't think the standard mandates anything
particular about the form of the 'is*' and 'to*' macros (if they even
exist), other than the requirement that they evaluate their argument
exactly once.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.

Nov 13 '05 #3
Jeremy Yallop wrote:

Looking over some code I came across a line like this

if isalnum((unsigned char)c) {

which was accepted by the compiler without complaint. Should the
compiler have issued a diagnostic in this case? (I think it's not
required to, but I'd like confirmation).


It's bad code, but not necessarily incorrect code.
For example, here's one of the several definitions of
isalnum() on the system I happen to be using at the
moment (exactly which definition you get depends on a
lot of environmental things):

#define isalnum(c) (__ctype_mask[c] & _ISALNUM)

Note the parentheses surrounding the replacement. Once
the macro is expanded in the context you've shown, you'll
have

if (__ctype_mask((unsigned char)c) & _ISALNUM) {

.... which is syntactically correct (as far as it goes).

Of course, relying on this would be a mistake.

--
Er*********@sun.com
Nov 13 '05 #4
In <bn************@ID-114079.news.uni-berlin.de> Jeremy Yallop <je****@jdyallop.freeserve.co.uk> writes:
Looking over some code I came across a line like this

if isalnum((unsigned char)c) {

which was accepted by the compiler without complaint. Should the
compiler have issued a diagnostic in this case? (I think it's not
required to, but I'd like confirmation).


It entirely depends on what the compiler is seeing in translation phase 7,
when the syntactical analysis of this statement takes place. If there is
an "#undef isalnum" in effect anywhere between the inclusion of <ctype.h>
and this statement, the diagnostic is required, of course.

Your example is no different from

if FOO {

Dan
--
Dan Pop
DESY Zeuthen, RZ group
Email: Da*****@ifh.de
Nov 13 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Steve | last post: by
1 post views Thread by Donald Canton | last post: by
3 posts views Thread by Manuel | last post: by
1 post views Thread by Hari Sekhon | last post: by
7 posts views Thread by Josh | last post: by
Banfa
5 posts views Thread by Banfa | last post: by
reply views Thread by MrMoon | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.