現在Cプログラミング中の天井冴太。とりあえず再利用出来そうな関数はプログラムから切り離してライブラリ化する事にしてみた。
開発にはVisual C++ 2005 Express Editionを使っているのだが、ふと設定("プロジェクト"メニューの"~~のプロパティ"の事)を覗いて見ると"言語拡張を無効にする"というオプションがあり、"いいえ"となっていた。ヘルプを見てみると、ANSI C++ または ANSI C と互換のない
Microsoft拡張機能
とある。
ふーん……成程。独自の拡張機能か……。このコードはWindows専用だけど、他のCコンパイラでもコンパイルできた方が良いな。ヨシ。"はい"にしよう。
設定を替えて、いざコンパイル。……と、怒涛の勢いでエラーの山が!しかもPlatform SDKのヘッダから!!
c:\program files\microsoft platform sdk\include\winnt.h(477) : error C2467: 無名の 'struct' の宣言が誤っています。c:\program files\microsoft platform sdk\include\winnt.h(5377) : error C2467: 無名の 'union' の宣言が誤っています。
c:\program files\microsoft platform sdk\include\winreg.h(113) : error C2061: 構文エラー : 識別子 'QUERYHANDLER'
c:\program files\microsoft platform sdk\include\winreg.h(113) : error C2059: 構文エラー : ';'
c:\program files\microsoft platform sdk\include\winreg.h(113) : error C2059: 構文エラー : '型'
c:\program files\microsoft platform sdk\include\winreg.h(116) : error C2143: 構文エラー : '{' が '*' の前にありません。
c:\program files\microsoft platform sdk\include\rpcndr.h(1021) : error C2133: 'Format' : サイズが不明です。
c:\program files\microsoft platform sdk\include\prsht.h(441) : fatal error C1003: プログラム内のエラーが 100 個を超えました。コンパイルは中断されます。
な、なんだってーーーー!(AA略)
とりあえず、エラーになった場所をサラッと見てみることにした。
まず出てきたのは次のようなコード。
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
} LARGE_INTEGER;
typedef struct _NT_TIB {
union {
PVOID FiberData;
DWORD Version;
};
} NT_TIB;
無名構造体/無名共用体ってC言語では駄目なんだねぇ。
typedef
DWORD _cdecl
QUERYHANDLER (LPVOID keycontext, PVALCONTEXT val_list, DWORD num_vals,
LPVOID outputbuffer, DWORD FAR *total_outlen, DWORD input_blen);
え!?関数ポインタのtypedefって駄目なの!!?
unsigned char Format[];
……なんて、意味不明な部分も。恐らくunsigned char *Format;って事だろうけど……
//*++
//
// Copyright (c) 1991-1999 Microsoft Corporation
//
// Module Name:
//
// nb30.h
//
// Abstract:
//
// This module contains the definitions for portable NetBIOS 3.0
// support.
//
//--*/
最新のC言語規格C99では許される//コメント。未だ拡張機能扱いのようだ。
意外と知らなかったこともあったなぁ
エラーを追いかけて気づいたが、結構『C言語で使える』と勘違いしていたC++機能があるなぁ。無名構造体/共用体なんかはその良い例だし、関数ポインタのtypedefも駄目みたいだ。
…………って、チョット待て。
『VCの拡張機能使わないとコンパイル出来ない』と云う事は、下手したら別のコンパイラではPlatform SDK使えない=C言語でWindowsプログラミング出来ない事もあるって事じゃないか。チョット、ソレってどうなんだよ!Microsoft!!
