pls@ncsu.UUCP (Phillip L. Shaffer) (12/06/84)
Some weeks ago, I posted a query about a C compiler that complained about spaces after undeclared function names. I received 10 responses, 8 of which said the compiler was broken, and 2 that suggested the compiler was correct. I consider the argument to be settled the compiler is wrong. I have repeated the two most forceful arguments below for this point of view, one of which is from the chairman of the relevant ANSI language subcommittee. I have also repeated the two arguments against this opinion, in the interest of fairness. I thank all those who responded. I'll let you know what Eco-Soft has to say. For the record, I first repeat my query, for those who didn't see it or don't recall it. Phil Shaffer (pls@ncsu) --- the query: ----------------------------------------------------- I would like to obtain a consensus, or at least a few opinions, on a minor point in C syntax. I have recently obtained the Eco-C C compiler for my Z-80 machine, and and am generally happy. It is doing one thing that I haven't seen before in other C compilers (namely UNIX 4.2BSD or DeSmet on an IBM PC): it complains about spaces after function names for funtions that have not been previously declared - the error message is "illegal function call," or somesuch. If you declare int functions before use, there is no problem. Thus: int foo(); foo (); causes no problem, but foo (); generates the complaint. K&R (p. 186, paragraph 4) seem to sanction this: "a hitherto unseen identifier followed immediately by a left parenthesis is contextually declared to represent a function returning an integer; thus, in the most common case, integer- valued functions need not be declared." The question is: does "followed immediately" mean "with nothing but white space in between" or is it to be taken literally? This is a minor annoyance to me - changing styles slightly and editing old programs before recompiling - but I thought I would get some other opinions before complaining to Eco-Soft. --- the arguments for "it's broken": -------------------------------- From: mcnc!decvax!genrad!mit-eddie!allegra!sfbc!lr Date: Fri, 9 Nov 84 03:16:05 est This is an easy one. "followed immediately" means with no tokens in-between, and the compiler is clearly wrong. The only time space before a parenthesis is significant is in a macro definition, to distinguish a macro with no arguments: #define foo (x) which expands into (x) always, from #define bar(x) which requires an argument but expands into nothing always. By the way, in invoking bar, either "bar(1)" or "bar (1)" are acceptable. The ANSI draft standard says "A function call is a primary expression followed by parentheses () containing ..." leaving out the misleading "immediately" and not melding in the irrelevant presence of a prior declaration. (That is discussed in the next paragraph.) So go get the vendor to fix it! Larry Rosler Chairman, Language Subcommittee ANSI X3J11 Committee ---------------------------------------------------------------------- Date: Thu, 22 Nov 84 12:11:06 mst From: unmvax!unm-la!jay (Jay Plett) In Section 2 of K&R's "C Reference Manual" (Lexical Conventions): "Blanks ... are ignored except as they serve to separate tokens. Some white space is required to separate other- wise adjacent identifiers, keywords, and constants." Nowhere does the Reference Manual suggest that white space delimits anything else. I take that to mean that white space is required to resolve ambiguities such as: int a, b; a+++b; but never to *alter* unambiguous contsructions such as: foo /* a function */ (blah, blahbar); ---------------------------------------------------------------------- --- the arguments for "the compiler is correct: ---------------------- ---------------------------------------------------------------------- Since spaces are significant in C (as opposed to FORTRAN), I suspect Kernighan & Ritchie meant to be taken literally. I prefer the "foo()" syntax anyway. ---------------------------------------------------------------------- My understanding was that since spaces are separators in C, the case of foo (); is invalid. I was taught that all functions need to be followed *immediately* (as stated in K&R) by the parenthesis. when you say: int foo (); you are declaring something thoroughly incomprehensible to a K&R C compiler. ---------------------------------------------------------------------- Thanks for the responses. Phil Shaffer