Author: Robert Hyatt
Date: 12:17:22 01/10/03
Go up one level in this thread
On January 09, 2003 at 19:56:44, Dieter Buerssner wrote: >On January 08, 2003 at 18:28:56, Robert Hyatt wrote: > >>On January 08, 2003 at 16:01:34, Dieter Buerssner wrote: >> >>>On January 08, 2003 at 15:45:27, Robert Hyatt wrote: >>> >>>>On January 07, 2003 at 09:16:21, Uri Blass wrote: >>>> >>>>>2)I get a lot of remarks for movei and the most popular remark is >>>>> >>>>>external definition with no prior declaration >>>>> >>>>>Do I need to declare function before I use it. >>>> >>>>Yes you must. >>> >>>Hmmm - I don't see this. Can you cite a part of the C Standard, that shows, that >>>you really "must"? >> >>Yes. >> >>The part that says "if a function is not declared before it is used, the >>assumptions are >>..." > >To me it seems, you are misinterpreting it here. When a function is defined, it >is also imlicetly declared. Note, that the warning in Uri's case was not at the >place, where the function was used, but at the place, where the function was >defined. I understand that. But that assumes that (a) the function is defined in the _same_ file before it is used and (b) the function is defined _before_ it is used. I can show you a program where this is impossible to do, which means that explicit declarations for the functions have to either appear directly in the procedures that call them, or more commonly, in a header file everything includes... > >int foo(void) >{ > return 1; >} > >int main (void) >{ > return foo(); >} > >Is perfectly legal C. As Heiner pointed out, it can be considered bad style. If >one really need to have foo with external linkage, a prototype will be needed >somewhere. Otherwise, static int foo() would be more appropriate. > >>:) >> >>By the same token, You should always use signed or unsigned when declaring chars >>since the standard leaves that an open issue as well... > >I understand your point here, but I don't agree in this generality. You need >signed or unsigned, when you use char as arithmetic types, and the range 0-127 >is not enough for this purpose. For a single flag (0 or 1) for example, you >don't need signed or unsigned. When using them for strings, signed or unsigned >would probably yield in many problems. All the str... functions want pointer to >char, and not pointer to signed char or pointer to unsigned char. > >>>>>5)operands are evaluated in unspecified order >>>>> >>>>>It is not my fault that the intel compiler does not know that the order of >>>>>adding is not important because it does not know that calculating one expression >>>>>does not change the second expression. >>>>> >>>>>Uri >>>> >>>>The order _is_ specific. That usually means you are mixing operators of >>>>difference > ^^^^^^^^^^ >>>>precedence without using () to specify your chosen order of evaluation. Just >>>>add >>>>the parens to avoid some _ugly_ errors... >>> >>>The order, in which different terms are evaluated in aritmetic expressions is >>>typically _not_ specific in C. Mixing operators of _different_ precedence >>>without () is no problem at all. Normally, one would not want to write >>> >>>w = ((x*y) + z); >> >> >>Sure... but what about the bitboard stuff that includes >> >>a>>n+1 >> >>That can wreck a program silently and hideously... >> >>Depending on what you mean... > >Sure, but this was not the point here. The point was, that even in > >w = (x() * y()) + z()); > >there is no guarantee, that x() or y() are called before z(). How the function >returns values are put together, is (with or without parentheses) well defined. > >Regards, >Dieter
This page took 0.02 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.