gccがvoid型のextern宣言を許可するのはなぜですか?これは拡張機能ですか、それとも標準Cですか?これの許容できる使用法はありますか?
これは拡張機能だと思いますが、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
fooをvoid型として定義することは、もちろんコンパイルエラーです。
$ gcc -c -Dextern= extern_void.c
extern_void.c:1: error: storage size of ‘foo’ isn’t known
比較のために、VisualStudio2008は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'