C90 allows declarations (almost) anywhere;  you just have to use an explicit binding construct, which in C consists of a statement block. That is, instead of this:<p><pre><code>  {
    int x = 3;

    do_something();

    int y = 4;

  }
</code></pre>
you write this:<p><pre><code>  {
    int x = 3;

    do_something();

    {
      int y = 4;
    }
  }
</code></pre>
As a Lisp programmer, I prefer clear binding constructs which put the variables in one place. The (define ...) in Scheme that you can put anywhere makes me cringe; you have to walk the code to expand that into proper lambdas before you can analyze it. Other Lisp programmers don&#x27;t agree with me. The CLISP implementation of Common Lisp, whose core internals are written in C and which historically predates C90, let alone C99, uses a &quot;declarations anywhere&quot; style on top of ANSI C. This is achieved with a text-to-text preprocessor called &quot;varbrace&quot; which basically adds the above braces in all the right places.<p>You get better locality with explicit binding blocks, because their scope can end sooner:<p><pre><code>   {
     foo *ptr = whatever();
     &#x2F;* this is a little capsule of code *&#x2F;
     &#x2F;* scope of ptr ends *&#x2F;
   }

   {
     foo *ptr = whatever_else(); &#x2F;* different ptr *&#x2F;
     &#x2F;* this is another little capsule of code *&#x2F;
   }
</code></pre>
These tighter scopes are much more tidy than the somewhat scatter-brained &quot;from here to the end of the function&quot; approach.<p>I can look at that capsule and know that <i>that</i> ptr is meaningful just within those seven lines of code. After the closing brace and before the opening one, any occurrence of the name &quot;ptr&quot; is irrelevant; any such occurrence refers to something else.