On 11/04/2011 20:58, spir wrote:
[slightly OT]

Hello,

I'm reading (just for interest) the LLVM Coding Standards at
http://llvm.org/docs/CodingStandards.html. Find them very interesting
because their purposes are clearly explained. Below sample.

Denis


That seem all fairly sensible. It also reminds me of open source projects written in C, where GOTO is used, like so:


HANDLE handle1 = open(...);

...
if (out_of_memory)
        goto cleanup;

if (invalid_format)
        goto cleanup;
...

cleanup:
   if (handle1)
      close(handle1);
   if (handle2)
    close(handle2);


This code uses the dreaded goto statement, but I belive you can see that the author is trying to make the code more readable, or at least get rid of the nested indents/multiple cleanup problem you inevitably come across at some points in C code. It does tend to be more readable than the alternative, too.

I think that people like to follow rules, that is as soon as they have internalised them and made them their own. What this means is that they often then follow them to a fault, and you get deeply nested, but "structured" code, where instead you would be better of with more logically linear code as in the case of the early exit. Coding standards should probably just say: try and write readable code. Everyone knows what readable code looks like. It just not always quick or easy to make it that way.


While I am on the subject, I've *always* thought major languages have poor loop constructs:


(A)

for (;;)
{
        std::getline(is, line);
        if (line.size() == 0)
                break;
        ...some things...
}


You have to call getline always at least once, then you need to test if the line is empty to terminate the loop. So how do you do it another way?

(B)
std::getline(is, line);
while (line.size() != 0)
{
        ...some things...
        std::getline(is, line);
}

Isn't there something a bit wrong here? N.B. a do .. while doesn't help here either.



in (A) there is no duplication, in essence what I am saying, is that there should be a loop whereby you can put the exit condition where you need it, but *also* the compiler should check you have an exit condition to prevent mistakes. This whole WHILE vs DO vs FOR loops thing is strange to me.

Instead you could just have:

loop
{
 ...
 if (condition) exit;
 ...
}

instead of WHILE and DO. Whereby you *must* have an exit condition.


But I suppose you need a FOR loop because the following may be error prone.

int x=0;
loop
{
if x > 9 exit;
...
x++;
}


So you would then end up with a LOOP a FOREVER (perhaps which is for(;;) by convention anyway) and a FOR loop.

I'll put the coffee down now...





Reply via email to