• ベストアンサー

VC++2005で言語拡張切ってみたら大量のエラー

VC++2005にて、言語拡張を切る(/Za)と、以下のようなエラーが36個ほど出ます。 ~略~\platformsdk\include\winnt.h(477) : error C2467: 無名の 'struct' の宣言が誤っています。 ~略~\platformsdk\include\winnt.h(495) : error C2467: 無名の 'struct' の宣言が誤っています。 そして、コンパイルできなくなります… なんというか、これはマイクロソフトの陰謀ということでいいのでしょうか? 報告例) http://agpg.seesaa.net/article/12818703.html

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

バイナリと矛盾しない形で正しくヘッダを書き換えれば、動作は可能です。(デバッグ情報とかは危ないかも) ただし、当然保証外になりますので自己責任でどうぞ。 > bcc32 -A (ANSIに準拠) や、g++ -ansi -pedantic-errors(ANSIに準拠)ならコンパイルできるのですが、 > これすらできないので… 手元のBCC5.6(Borland C++ Builder X)添付のwindows.hは、Borlandの修正が入ってますし、 GCC(MinGW)で使われるwindows.hは、ライセンス上の問題などからMicrosoftのコードではないものが使われますので、挙動が違うのは当然かと思います。 PlatformSDKのヘッダをVCにポートした際に、そこまで保証しないポーティングの仕方にした/なってしまった/なっている、というあたりかと思います。 > 結局、windows.hなど、環境に依存するヘッダをインクルードする必要のあるものは言語拡張を使うしかないのでしょうか? Microsoft社の現行コンパイラに添付のヘッダを、保証がある状態で使うには多分そうなります。

SHOO-3
質問者

お礼

回答ありがとうございます。 バックアップを取ってヘッダを書き換えたところ、確かにエラー件数は減ったので、できそうではあります。保障まで考えるとやらないほうがよさそうですか… ともあれ、詳しい回答ありがとうございました。これで回答を締め切らせていただきます。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

そもそも言語拡張を切りたい理由は何でしょうか? 移植性の高いコードを書くことが理由なら、windows.hなどをインクルードすること自体に問題があります。 移植性を向上させるには、環境に依存した部分を別モジュールに分離したり、抽象層を間に入れるなどして、依存性を吸収する必要があります。その場合、依存部は/Zaオプションを付けずにコンパイルし、非依存部は/Zaオプションをつけてコンパイルすればよいでしょう。 ところで、#3でMrBanさんが書かれている見解は私も賛成です。 文句をいうなら、strcpyを使ったときに警告が出るとか、andやorといったキーワードが使えないとか、 export template <class T> T \u8ad6\u9094(T arg) {  return arg; } がコンパイルできないとか、 #include <stddef.h> std::size_t size = 10; がエラーになるとか、に対していうべきです。

SHOO-3
質問者

補足

理由は「やってみたかったから」で、エラーが出たからといって、言語拡張を取り払わなければいい話なので、特に文句を言っているわけでもありませんよ。(陰謀という表現が悪かったか。 ただ、windows.hをインクルードしただけでエラーが出るので、これはどう足掻いてもできないという仕様なのか、それともヘッダの書き換えとかしてがんばればコンパイルできるようになるのか、というあたりが知りたかったのです。 下記コードであれば、 #include <windows.h> int main(int argc, char* argv[]){ return 0; } bcc32 -A (ANSIに準拠) や、g++ -ansi -pedantic-errors(ANSIに準拠)ならコンパイルできるのですが、これすらできないので… 結局、windows.hなど、環境に依存するヘッダをインクルードする必要のあるものは言語拡張を使うしかないのでしょうか?

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

陰謀ではないでしょう。 あと、OSベンダとコンパイラベンダ等の立場の区別とかも考えられた方がよいかもしれません。 VS2005(というかVC8)においても、標準C/C++(ISO/IEC14882)の範囲だけでコードを書けばそのエラーはでなかったりしませんか。 ソレが出ているのは、VCが提供する「言語の標準ヘッダ」ではなく「Platform SDK(Windows用の環境依存ヘッダ)」ではないですか。 windows.hは、もともと標準でもなんでもない依存環境の独自ヘッダなのですから、言語拡張を使っていてもそもそも標準の範囲外のことと思います。 # もう、WinMainから始まってる時点で…。 コンソールから、言語標準範囲のヘッダだけで完全適合なコードを書いても通らなかったときに、初めて文句を言いましょう。 # それでも、もっとダメダメなC++コンパイラの方が多いわけですが。

SHOO-3
質問者

補足

ということは、windows.hをインクルードする以上、この問題は解決し得ない問題なのでしょうか? 言語拡張切った状態で、これらのエラーを回避する方法は無いのでしょうか?

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

ソフトウェアを作るときに、言語仕様に無い拡張を加えるのはよくあること。

  • suseimei
  • ベストアンサー率35% (17/48)
回答No.1

陰謀ではありません。 マイクロソフトは私企業ですから営利を追及する 権利を有します。 なお、言語仕様などの標準仕様には関係者の”好み”や人生観 が当然反映されています。ソフトウェアビジネスはそんなに甘 くありません。 紹介するURLの情報をじっくり読んでみるとよいでしょう。

参考URL:
http://www.ttoyota.com/

関連するQ&A

  • VC++2005でLAPACKを使用するとエラーが出る

    タイトルの通りなのですが,VC++2005でLAPACKを使用するとエラーが出て,困っています. vc\include\clapack.h(1486) : error C2144: 構文エラー : 'char' は ')' によって先行されなければなりません。 vc\include\clapack.h(1486) : error C2144: 構文エラー : 'char' は ';' によって先行されなければなりません。 vc\include\clapack.h(1486) : warning C4091: '' : 変数が何も宣言されていないときは、'char' の左辺を無視します。 vc\include\clapack.h(1486) : error C2143: 構文エラー : ';' が ',' の前にありません。 vc\include\clapack.h(1486) : error C2059: 構文エラー : ',' vc\include\clapack.h(1486) : error C2059: 構文エラー : ')' vc\include\clapack.h(2861) : error C2144: 構文エラー : 'char' は ')' によって先行されなければなりません。 vc\include\clapack.h(2861) : error C2144: 構文エラー : 'char' は ';' によって先行されなければなりません。 vc\include\clapack.h(2861) : warning C4091: '' : 変数が何も宣言されていないときは、'char' の左辺を無視します。 vc\include\clapack.h(2861) : error C2143: 構文エラー : ';' が ',' の前にありません。 vc\include\clapack.h(2861) : error C2059: 構文エラー : ',' vc\include\clapack.h(2861) : error C2059: 構文エラー : ')' 主にhttp://sakura.math.kyushu-u.ac.jp/wiki/index.php?%E8%A8%88%E7%AE%97%E6%A9%9F%E8%A8%AD%E5%AE%9A%2FCLAPACKを参考にして作成しているのですが・・・上手くいきません.詳しい方,ご教授お願い致します.

  • VC++6.0のプロジェクトをVC++2005Expressで動かしたいがエラーが出まくってしまいます。

    VC++6.0のプロジェクトをVC++2005Expressで動かしたいのですが エラーが出まくってしまいます。 VC++6.0では正常にコンパイル終了するものがexpressだと、 ・・・string.h(135) : warning C4003: マクロ '__DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_1_EX' に指定された実引数の数が少なすぎます。 とか、 ・・・string.h(135) : error C2065: '_string' : 定義されていない識別子です。 とか、 ・・・string.h(135) : error C2275: '_locale_t' : この型は演算子として使用できません とかです。string.hなど、触ったこともないのですが、 express用に編集が必要なのでしょうか? ちなみに PlatformSDK などはインストールして、include,exectable,library ディレクトリなどのパスも通しています。 何か良い方法を教えてください。お願いします。

  • C2146を回避するにはどうしたら良いのでしょうか

    いつもここにお世話になってますm(__)m。今回は下記の様なエラーが出てしまい、困っております(--;)。 <エラー内容> 1>C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C2146: 構文エラー : ';' が、識別子 'PVOID64' の前に必要です。 1>C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h(222) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません エラーが起こっているのはwinnt.h内の「typedef void * POINTER_64 PVOID64;」という部分なのですが(他にもありますが)、winnt.hは弄ってないのです。 ネットで検索したところインクルードファイルディレクトリの指定の順番が怪しそうなので、「ツール」「オプション」でPlatformSDK関連が一番上に来るように変更(実行可能ファイル、インクルードファイル、ライブラリファイル)してリビルドしてみましたが結果は変わりませんでした。 他にチェックすべき点をお教え頂けると助かります。 [環境] ・WindowsXP(SP2) ・Visual Studio 2005 Professional(C++、SPなし)

  • VC++ のコンパイルエラーについて

    現在、解説書に記載されているコードをVC++でコンパイルできるか試しながらC++を独習中です。エラーの原因と対応が分からず困っております。どなかたご教示よろしくお願いします。 日付を表示するプログラムで米国表示か英国表示にするか列挙型の宣言と静的メンバーをヘッダーファイルに記載し、フラッグの定義と初期化をするプログラムをコンパイルしました。 ---クラス定義(ファイル名:date.h)--- #include <iostream.h> class date{ ----------------------- enum Lang {USA, UK}; static Lang format; public: ----------------------- }; ---メンバー関数定義(ファイル名:date.cpp)--- #include <string.h> #include <ctype.h> #include <stdlib.h> #include "date.h" ----------------------- Lang date::format = USA; ----------------------- ---------------------------------------- このファイルをコンパイルした結果、下記のエラーメッセージが表示されました。 エラー発生箇所は上記「Lang date::format = USA;」でした --------------------構成: date - Win32 Debug-------------------- コンパイル中... date.cpp date.cpp(17) : error C2501: 'Lang' : 識別名を宣言するのに、型が指定されていません。 date.cpp(17) : error C2239: 無効なトークン 'tag::id' が 'Lang' の宣言の後にあらわれました。 date.cpp(17) : error C2321: 構文エラー : 予期しない 'date::format' です。 cl.exe の実行エラー date.obj - エラー 3、警告 0 ----------------------------------------------------------------------------- エラーの原因と解決方法が分かりません。 よろしくお願いします。

  • エラーでリンクができません(VC++)。「外部シンボル

    error LNK2001: 外部シンボル "_IID_IAutoComplete2" は未解決です error LNK2001: 外部シンボル "_CLSID_AutoComplete" は未解決です error LNK2001: 外部シンボル "_IID_IAutoComplete" は未解決です これら3つのエラーが出るためビルドに失敗します(コンパイルは成功しますがリンクに失敗します)。 MSDNによると #include "shldisp.h" #include "shlguid.h" が必要とあるのでincludeしています。VC++上でこのヘッダーファイル上で右クリックをして現れたメニューからファイルを開くと、この中にはきちんと「IID_IAutoComplete2」などが定義されています。またこれらのヘッダーファイルはPlatformSDK 20002年10月版 を使用しています。 MSDNにはshell32.dllのVer5.0以上が必要と書かれていますが、使用しているOSにインストールされているshell32.dllはver6.00.2600.0000です。 #include "shlguid.h"に含まれている以下の行をコピーしてソースに貼り付けると2つ目のエラーはなくなります。 DEFINE_GUID(CLSID_AutoComplete, 0x00BB2763L, 0x6A77, 0x11D0, 0xA5, 0x35, 0x00, 0xC0, 0x4F, 0xD7, 0xD0, 0x62); 環境は Windows XP InternetExplorer 6.0 Visual C++ 6.0 SP5 PlatformSDK(2002/10)(CoreSDK) PlatformSDK(2002/10)(InternetSDK) です。 何が原因でリンクできないのでしょう??まったくお手上げな状態です。分かる方がいましたらよろしくお願いします。

  • VC構文エラー、”:”

    VC++6でコンパイルしています コンパイラが古いのだと思いますが、最近のサンプルソース(誤記は無いはず)が合成時エラーします struct _MP { USHORT MaxPacket:11; /* 0..10 */  ←エラー USHORT HSmux:2; /* 11..12 */ USHORT Reserved:3; /* 13..15 */ }; error C2059: 構文エラー : 'constant' ここの MaxPacket:11; 見たこと無い書き方なのですが ”:” がvc+++6でエラーなのだと思います vc++6的にはどう書くのでしょうか? よろしくお願いします

  • VC++ iostreamの不具合(?)

    手強いVC++のエラーです(対処が効かない #include <iostream> int main () {cout << "ggrks"; return 0;} C2065エラー 'cout' : 定義されていない識別子です。 #include <iostream.h> int main () {cout << "Hello C++!"; return 0;} C1083エラー include ファイルを開けません。'iostream.h': No such file or directory iostream(拡張子無)はCドライブのプログラムファイル、Microsoft Visual Studio 9.0\VC\includeに存在してます。 パスは許可してあります。 ツール→VC++ディレクトリ→インクルードファイルで C:\Program Files\Microsoft Visual Studio 9.0\VC\include と C:\Program Files\Microsoft Visual Studio 9.0\VC\include\iostream もついでに。 インストが完全でなかったのかと思い、「修復又は再インストール」で再インストしましたが変わりません。 気分転換(?)に一回アンインストールしてから再インストール(あまり意味ありませんけど)しても同様です。 どうすれば良いでしょうか。ご教授願います。

  • VC++ 2010 Expressのエラー

    visual C++ 2010 Expressでビルドエラーが解消できません。 VC++初心者です。非常に困っているので、お答えいただきたいです。 ARtoolkitとkinectを使用するために、windows8(64bit)でvisual C++ 2010 Expressを使用し、ビルドをしようとすると fatal error C1083: include ファイルを開けません。'windows.h': No such file or directory このようなエラーが表示されます。同様にexcpt.h、sdkddkver.h、stdio.h、stdlib.h、crtdefs.hもincludeできないとエラーが表示されます。 これらのファイルは全てC:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include の中に存在したため、このディレクトリをインクルードディレクトリとライブラリディレクトリに追加すると、includeファイルを開けないエラーは解消するのですが、 fatal error C1189: #error : ERROR: Use of C runtime library internal header file. というエラーが表示され、検索してみたものの原因がわからずにいます。 また既にvisual C++2008でARtoolkitを動かせる状態にしてあることも影響はあるのでしょうか? 大変わかりずらい質問で恐縮ですがお答えいただきたいです。

  • VC++のエラー

    windows xp VC++ 6.0 http://www.kumei.ne.jp/c_lang/intro/no_57.htm に書いてある通りに、タイプをwin32 Application で 設定して、 #include <windows.h> int WINAPI WinMain( HANDLE hInstance , HANDLE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL, (LPCSTR)"メッセージ・ボックスのテストです。", (LPCSTR)"猫でもわかるプログラミング", MB_OK); return 0; } をプロジェクトに追加し、ビルドすると、 ******************************** --------------------構成: aaadf - Win32 Debug-------------------- コンパイル中... fdfdfdf.cpp D:\VC\aaadf\fdfdfdf.cpp(7) : error C2731: 'WinMain' : 関数はオーバーロードできません。 D:\VC\aaadf\fdfdfdf.cpp(5) : 'WinMain' の宣言を確認してください。 cl.exe の実行エラー fdfdfdf.obj - エラー 1、警告 0 ********************************* とエラーになります。 何がいけないのかさっぱりわかりません。。

  • VCでヘッダが見えないエラー

     Vista上でVisualStudio2008を使っています。c:\Program Files下にWinPcapをインストールして、ユーザホームのドキュメントフォルダ下にVCのワークスペースを作成してあります。  この状態で、WinPcapのサンプルプロジェクトを作ってプログラム実行すると、  fatal error C1083: include ファイルを開けません。'pcap.h': No such file or directory というエラーが出ます。VCは管理者権限で起動しています。ヘッダファイルのあるディレクトリの読み取り権限はあります。  他に何を確認すべきか教えてください。

専門家に質問してみよう