<div dir="ltr"><div>#include &lt;stdio.h&gt;<br><br>int main()<br>{<br>    int hello();<br>    int a;<br>    a = hello();<br>    printf(&quot;%d\n&quot;, a);<br>    a = hello2();<br>    printf(&quot;%d\n&quot;, a);<br>    return 0;//hello();<br>}<br><br>int hello()<br>{<br>    int hello2();<br>    printf(&quot;Hello\n&quot;);<br>    return 1;<br>}<br><br>int hello2()<br>{<br></div><div>    return 2;<br>}<br><br><br></div><div>По идеи hello2() объявляется внутри hello(), тем не менее hello2() видна и после выполнения hello(). А как же локальные переменные, которые должны быть уничтожены после выполнения hello()? Адрес на hello2() остается, т.е. мы имеем дело с внешним связыванием, несмотря на то, что функция не обявлена за пределами какого-то блока.<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2014-12-02 12:04 GMT+01:00 Alex Naumov <span dir="ltr">&lt;<a href="mailto:alexander_naumov@opensuse.org" target="_blank">alexander_naumov@opensuse.org</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Я работаю с gcc 4.8.1 на x86_64. Мне, в принципе, больше ничего и не надо, т.е. код пишу для себя.<br><br></div>Дело даже не в том, на сколько это полезно и в каких случаях. Мне просто интересно какие могут быть проблемы в данном случае. Стоит ли быть тревогу, если встречается такой код?<br>Вот Андрей написал о проблеме переноса кода на другие архитектуры. Это да. Код всегда нужно тестировать при переносе. Но может быть есть проблемы, которые можно встретить в данном случае с 100% вероятностью?<br></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2014-12-02 11:31 GMT+01:00 Denis Kirjanov <span dir="ltr">&lt;<a href="mailto:kirjanov@gmail.com" target="_blank">kirjanov@gmail.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">А какие компиляторы ты пробовал?<br>
<br>
Я просто не понимаю зачем это может быть полезно. Я не видел кода на C<br>
который использует nested functions.<br>
<div><div><br>
On 12/2/14, Alex Naumov &lt;<a href="mailto:alexander_naumov@opensuse.org" target="_blank">alexander_naumov@opensuse.org</a>&gt; wrote:<br>
&gt; Мне не совсем понятно значение &quot;do not support&quot; в данном контексте. Это<br>
&gt; работет.<br>
&gt; Поведение программы не определено, т.е. никогда нельзя знать наверняка как<br>
&gt; поведет себя программа в данном случае?<br>
&gt;<br>
&gt;<br>
&gt; 2014-12-02 11:10 GMT+01:00 Denis Kirjanov &lt;<a href="mailto:kirjanov@gmail.com" target="_blank">kirjanov@gmail.com</a>&gt;:<br>
&gt;<br>
&gt;&gt; Standard C and C++ do not support nested functions, but:<br>
&gt;&gt; GCC supports nested functions in C, as a language extension.[5]<br>
&gt;&gt;<br>
&gt;&gt; On 12/2/14, Alex Naumov &lt;<a href="mailto:alexander_naumov@opensuse.org" target="_blank">alexander_naumov@opensuse.org</a>&gt; wrote:<br>
&gt;&gt; &gt; Всем привет.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; У К&amp;R в 4.3 главе написано:<br>
&gt;&gt; &gt; &quot;Сами по себе функции - всегда внешние, поскольку в C нельзя определить<br>
&gt;&gt; &gt; функцию внутри другой функции.&quot;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Тем не менее, определить функцию f() внутри тела функции main() и<br>
&gt;&gt; &gt; вызвать<br>
&gt;&gt; &gt; её можно без проблем. Более того, в главе 4.2 у K&amp;R присутствует такой<br>
&gt;&gt; &gt; пример. Кто что думает по поводу объявления функций внутри других<br>
&gt;&gt; функций?<br>
&gt;&gt; &gt; Какие подводные камни ожидают программиста в этом случае?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Alex<br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Regards,<br>
&gt;&gt; Denis<br>
&gt;&gt;<br>
&gt;<br>
<br>
<br>
</div></div><span><font color="#888888">--<br>
Regards,<br>
Denis<br>
</font></span></blockquote></div><br></div>
</div></div></blockquote></div><br></div>