Perché gcc consente dichiarazioni extern di tipo void? È un'estensione o standard C? Ci sono usi accettabili per questo?Perché gcc consente dichiarazioni extern di tipo void (non-pointer)?
sto indovinando che è un'estensione, ma io non lo trovo menzionato:
http://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/C-Extensions.html
$ 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
Definire foo come tipo vuoto è, naturalmente, un errore di compilazione:
$ gcc -c -Dextern= extern_void.c
extern_void.c:1: error: storage size of ‘foo’ isn’t known
Per il confronto, Visual Studio 2008 restituisce un errore nella dichiarazione extern:
$ 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'
Ciò che è interessante è che anche con '-std = c89 -pedantic' gcc è bello con questo. – Dave
Come ho capito, la definizione di una variabile di tipo 'void' è mal formata, l'applicazione di' extern' su un tipo incompleto non è mal formata però, Per [esempio] (http://ideone.com/v7VkF): ' extern' su array con dimensione sconosciuta, che viene definita in seguito.Tuttavia, ** §6.2.5.19 ** dice * "Il tipo void comprende un insieme vuoto di valori, è un tipo di oggetto incompleto che non può essere completato." *, dato che il tuo codice dovrebbe essere trattato come una violazione del vincolo. Il fatto che compili in modo pulito con '-pedantic' dice che non è un'estensione questo è bug o ambiguità di gcc in modi in cui msvc e gcc interpretano lo standard. –