Simon Küppers wrote:
> Jou, das geht in der Tat nicht, da habt ihr Recht. Aber was hätte das
> fürn Sinn? *grübel
>
> Vermutlich keinen, weil es sonst zum C-Standard gehören würde. Hehe!
Och, das würde ich so nicht sagen.
Das macht schon auch Sinn, weil ja durch die Funktion ein
Scope eröffnet wird:
1 | void foo()
|
2 | {
|
3 | int i, j;
|
4 |
|
5 | void bar()
|
6 | {
|
7 | int i;
|
8 |
|
9 | j = i; // das j stammt von foo
|
10 | }
|
11 | }
|
12 |
|
13 | void foo2()
|
14 | {
|
15 | int a, b;
|
16 |
|
17 | void bar() // ich kann hier nochmal eine Funktion bar
|
18 | // machen, die mit der in foo nicht kollidiert
|
19 | {
|
20 | a = b;
|
21 | }
|
22 | }
|
Die Sinnhaftigkeit ist im Grunde dieselbe, die auch zu einer
Änderung der Variablendefinition geführt hat:
Früher mussten alle Variablen am Funktionsanfang definiert
werden. Dann wurde das geändert: in jedem Block können
Variablen definiert werden, die sich auch nicht ins Gehege
kommen.
1 | void foo()
|
2 | {
|
3 | int i;
|
4 |
|
5 | while( 1 ) {
|
6 | // Ein neuer Block. Damit können hier neue 'blocklokale'
|
7 | // Variablen erzeugt werden, die den Block nicht überleben
|
8 |
|
9 | int k = 5;
|
10 | }
|
11 |
|
12 | // hier gibt es kein k mehr
|
13 | }
|
Die Idee dahinter ist es, Variablen erst dann zu definieren, wenn
sie auch tatsächlich gebraucht werden.
So ähnlich kann man das auch mit Funktionen sehen:
Eine Funktion kann nur in dem Kontext definiert werden, in dem
sie auch benutzt wird. Die übergeordnete Funktion fungiert als
eine Art 'Sichtbarkeitsbremse'. Ausserhalb davon weiss niemand was
von der Funktion.
In Ur-Pascal war das eine sinnvolle Sache. In C ist der Sinn
aber, na ja, etwas zweifelhaft, weil man ja mit Aufteilung von
Funktionen in verschiedene Files und static-Funktionen dasselbe
erreichen kann.
Compilertechnisch ist das ganze auch kein grosses Problem, nur
ist wahrscheinlich die Nachfrage danach nicht gross genug, sodass
das Standard-Kommitee bisher keine Veranlassung fand sowas zu
normieren.