¿Por qué gcc permite declaraciones externas de tipo void (no puntero)?

¿Por qué gcc permite declaraciones externas de tipo void? ¿Es esta una extensión o estándar C? ¿Hay usos aceptables para esto?

Supongo que es una extensión, pero no lo encuentro mencionado en:
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>

Definir foo como tipo void es, por supuesto, un error de compilación:

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

Para comparación, Visual Studio 2008 da un error en la declaración externa:

<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>

Respuestas a la pregunta(4)

Su respuesta a la pregunta