C Programming

Wade Chandler wchandler at redesetgrow.com
Mon May 10 22:47:52 UTC 2004


fredex wrote:

> On Sun, May 09, 2004 at 10:48:03PM -0500, Jeff Vian wrote:
> 
>>
>>fredex wrote:
>>
>>
>>>On Sun, May 09, 2004 at 08:34:28AM -0500, Jeff Vian wrote:
>>>
>>>
>>>
>>>>fredex wrote:
>>>>  
>>>>
>>>>
>>>>>On Sat, May 08, 2004 at 10:46:37PM -0400, Wade Chandler wrote:
>>>>>    
>>>>>
>>>>>
>>>>>>Gene Heskett wrote:
>>>>>>      
>>>>>>
>>>>>>
>>>>>>>On Saturday 08 May 2004 06:27, Trevor McNamara wrote:
>>>>>>>        
>>>>>>>
>>>>>>>
>>>>>>>>Hello,
>>>>>>>>          
>>>>>>>>
>>
>><snip>
>>
>>>>>Not to be a negative-sounding force here, but I would urge you to NOT
>>>>>ever use any of Herbert Schildt's books.
>>>>>
>>>>>Mr. Schildt is a skillful writer, his writing is clear and lucid. He
>>>>>writes books on C and  C++ that very easily and clearly lead you down
>>>>>the path to writing programs that are WRONG. he teaches bad practice in
>>>>>C and C++ in clear and easily understood ways, such that if you follow
>>>>>his advice you will learn his bad habits. one minor example is that he
>>>>>is one of the many people who incorrectly teach that it is permissible
>>>>>to declare main() as being of type void:
>>>>>	void main (void)
>>>>>		{
>>>>>		...
>>>>>		}
>>>>>A little web searching, or spending a little time on groups.google.com
>>>>>reading comp.lang.c will find you plenty of examples of why his books
>>>>>are not a good way to learn C or C++. You can learn, in the same way,
>>>>>of many other books that do teach the language(s) correctly.
>>>>>
>>>>>
>>>>>    
>>>>>
>>>>
>>>>Please explain why main cannot be of type void.
>>>>  
>>>>
>>>
>>>1. Because the ANSI/ISO standard for the C language requires that main
>>>returns int.
>>>
>>>2. And if that isn't good enough for you, if you don't care about
>>>standards, look at the practical implications. When you write a function:
>>>
>>>
>>>
>>
>>I expected a reasoned discussion, not flaming.
> 
> 
> I didn't (and don't) view this as flaming. I merely state it that way
> because I've seen discussion on this for years from people who aren't
> interested in what the standard says (they say "Well, it works for me
> on my compiler, so why shouldn't I use it???). So, I gave a practical
> reason for why it matters.
> 
> 
>><snip>
>>
>>>>While I agree main is most often typed to int for the purpose of 
>>>>returning a value designating completion with no errors or an error, 
>>>>there is no *requirement* for that.
>>>>  
>>>>
>>>
>>>ah, but there is. Again, the language standard requires that main return
>>>an integer.
>>>
>>>
>>>So "why", you ask, "does the standard require main to return int?".
>>>The original C standard was written to "codify existing practice". In many
>>>environments (Unix, MS-DOS, probably other platforms) the return value of 
>>>main is (or can be) used by the invoking program as a success or fail
>>>status indicator. If the program doesn't return such a value the calling
>>>program has no way to find out if hte program ran successfully or not.
>>>
>>>
>>
>>true
>>
>>
>>>True, you CAN write a broken program that doesn't return anything from
>>>main, but it's still going to hand back SOME value to the invoking program
>>>as its status. if you don't provide a value, the code that calls main is
>>>going to return something anyway, most likely some garbage/arbitrary
>>>value it picked up from the place main's return should have been, but 
>>>wasn't (since main is expected to return something but didn't).
>>>
>>>Understand, main() is NOT the first code to execute when a C program is
>>>invoked. There's a chunk of "startup code", that is provided by the 
>>>compiler vendor or a linkable library (invisible to the user) that
>>>actually is invoked first, before main(). This code may do little in some
>>>environments, or in other environments it may do a great deal of
>>>stuff. But whatever it does, it (among other things) hands main its two
>>>arguments, and receives an integer back from main. Changing the type of
>>>main in your program does not change this code.
>>>
>>>
>>>
>>>
>>>
>>>>If you can provide *definitive documentation* of your statement that his 
>>>>teaching is wrong in the requirements for function main() I would like 
>>>>to see it.
>>>>  
>>>>
>>>
>>>See the language standard document.
>>>
>>>
>>
>>I did look at that, all 550 pages of it.
>>
> 
> OK, then,  you surely saw the place(s) where it discusses main().
> 
> 
>>>Or go ask this question in the newsgroup comp.lang.c where you'll either
>>>be ignored as a troll, or else will get flamed, depending on the mood
>>>this week.
>>>
>>>Mr. Schildt, for all his skill as a writer (and he is good, no denying
>>>that!), is one (of many) people who perpetuate the myth that it's OK
>>>to play fast and loose with the language standard. The result is that
>>>so many people think that it IS OK to do so. But some day, somewhere in
>>>the future, doing one of these things he teaches will nail your program
>>>to the wall and you won't have a clue why it went wrong.
>>>
>>>
>>
>>This as certainly not the first author of programming books to violate 
>>the standards in his methods.  I first learned C in the days of 
> 
> 
> Did I say he was the first/only? No, I did not.
> 
> 
>>Borland's Turbo C compiler, (taught at Drexel University in 
>>Philadelphia), and the text book used in that class also ignored the 
>>return type of main().  ( yes, I still have the text and verified this )
>>
>>Are you planning to be this hostile about ALL books that you don't 
>>happen to like.?
> 
> 
> Again, it's not intended as hostility. It is intended as a warning to
> people who will take a book and learn from it, especially those books
> that teach incorrect programming. It's not the reader's fault that the
> book teaches them wrongly. However someone who does not already know C
> will not be able to discern those areas where the book teaches wrong
> practice. There are books around that carefully do not teach bad practice,
> many of them are recommended whenever this discussion comes up.
> 
> Again, the reason why I warn people about the books of Mr. Schildt is
> that they too often teach bad practice, book after book. (no I haven't
> read them all, but I have read some of them, and have seen plenty of
> disucssion from those who both know C and have read his books).
> 
> 
> I've said all I want to say on this. Please do not continue to
> misinterpret what I'm trying to say (which is intended as a service to
> those who might be lead astray by books that teach incorrect practice).
> 
> 
>>Your point would be much better made without hostility, but reasoned 
>>agrument instead.  I noted where the standards define main and I am 
>>satisfied with that.  All I originally asked for was the location where 
>>it was defined that way, not a hostile diatribe.
> 
> 
> And you got a pointer to the standard (I don't happen to have a copy
> of it HERE right now to which I can refer so I could have given you
> a more detailed reference). What you also got was a lengthy discussion
> of why it matters, it was NOT a diatribe. sorry if you misinterpreted it.
> 
> Goodbye.
> 
> 
> 
Basically this thread has went nuts.  I followed up on a post and I 
mentioned the wrong name of a book of Herberts I like, and I still do by 
the way.  It isn't C++ Bible, but "The Complete Reference: C++".  One, 
this book doesn't use void main(void).  The only mention of void in main 
is int main(void) or int main() (perfectly legal and logical).  int 
main() directly from "The C++ Programming Language" Stroustrap and int 
main(void) and even int main()...in "The C Programming Language" 
Kernighan/Ritchie.

Anyways, void main(void) is a bad example to use to make a point against 
an author without giving a book and page number.  I have not seen where 
Schildt says to use or uses void main(void) in any book I've seen.  In 
the complete reference I can turn to the index page 1003 look in M and 
find a reference to page 153 (main, return  value from) (in the complete 
reference).  Now, if I turn to page 153 I'll find (as I should):
"
What Does main() Return?
The main() function returns an integer to the calling process, which is 
generally the operating system.  Returning a value from main() is the 
equivalent of calling exit() with the same value.  If main() does not 
explicitly return a value, the value passed to the calling process is 
technically undefined.  In practice, most C/C++ compilers automatically 
return 0, but do not rely on this if portability is a concern.
"

I guess he could have said one should always use return values, which 
would have been more correct according to many standards, however, I 
don't think this warrants an example of void main(void) in his name. 
Maybe you saw some typo or something that passed the editors, but I have 
never seen void main(void) in the book I'm speaking of nor any others of 
his...that I have personally seen.

I personally find "The Complete Reference: C++" to be a well written 
book, and it gets into details that plenty of books I have read do not. 
   I know plenty of convert C to C++ programmers who use static instead 
of an empty namespace for hiding from the global scope because they 
don't know you can...apparently.  So instead of typing a few characters 
they have to type static multiple times.

Contrast this book to "The C++ Programming Language".  I happen to like 
Stroustrap's book, but it is a little hard to read at times.  It isn't 
because the subject is very complicated either.  It is just laid out a 
little strange (in my opinion), and isn't as nice to read as "The 
Complete Reference: C++".  It just doesn't seem to flow as well is what 
I'm saying.  This in no way means that Stroustrap's book isn't useful or 
doesn't have a lot of good info.  I happen to like them both, but I 
don't believe Schildts writing is bad nor incorrect either.

Remember that I'm talking about "The Complete Reference: C++" as the 
example here.

Wade






More information about the fedora-list mailing list