Warum erlaubt gcc externe Deklarationen vom Typ void (ohne Zeiger)?

Warum erlaubt gcc externe Deklarationen vom Typ void? Ist das eine Erweiterung oder Standard C? Gibt es dafür akzeptable Verwendungen?

Ich vermute, es ist eine Erweiterung, aber ich finde es nicht erwähnt unter:
http://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/C-Extensions.html

<code>$ cat extern_void.c
extern void foo; /* ok in gcc 4.3, not ok in Visual Studio 2008 */
void* get_foo_ptr(void) { return &foo; }

$ gcc -c extern_void.c # no compile error

$ gcc --version | head -n 1
gcc (Debian 4.3.2-1.1) 4.3.2
</code>

Die Definition von foo als Typ void ist natürlich ein Kompilierungsfehler:

<code>$ gcc -c -Dextern= extern_void.c
extern_void.c:1: error: storage size of ‘foo’ isn’t known
</code>

Zum Vergleich gibt Visual Studio 2008 einen Fehler in der externen Deklaration aus:

<code>$ cl /c extern_void.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

extern_void.c
extern_void.c(1) : error C2182: 'foo' : illegal use of type 'void'
</code>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage