dポイントプレゼントキャンペーン実施中!

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

A 回答 (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社の現行コンパイラに添付のヘッダを、保証がある状態で使うには多分そうなります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/07 05:09

そもそも言語拡張を切りたい理由は何でしょうか?


移植性の高いコードを書くことが理由なら、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;

がエラーになるとか、に対していうべきです。

この回答への補足

理由は「やってみたかったから」で、エラーが出たからといって、言語拡張を取り払わなければいい話なので、特に文句を言っているわけでもありませんよ。(陰謀という表現が悪かったか。

ただ、windows.hをインクルードしただけでエラーが出るので、これはどう足掻いてもできないという仕様なのか、それともヘッダの書き換えとかしてがんばればコンパイルできるようになるのか、というあたりが知りたかったのです。

下記コードであれば、
#include <windows.h>
int main(int argc, char* argv[]){
return 0;
}
bcc32 -A (ANSIに準拠) や、g++ -ansi -pedantic-errors(ANSIに準拠)ならコンパイルできるのですが、これすらできないので…

結局、windows.hなど、環境に依存するヘッダをインクルードする必要のあるものは言語拡張を使うしかないのでしょうか?

補足日時:2006/09/06 18:27
    • good
    • 0

陰謀ではないでしょう。



あと、OSベンダとコンパイラベンダ等の立場の区別とかも考えられた方がよいかもしれません。

VS2005(というかVC8)においても、標準C/C++(ISO/IEC14882)の範囲だけでコードを書けばそのエラーはでなかったりしませんか。

ソレが出ているのは、VCが提供する「言語の標準ヘッダ」ではなく「Platform SDK(Windows用の環境依存ヘッダ)」ではないですか。

windows.hは、もともと標準でもなんでもない依存環境の独自ヘッダなのですから、言語拡張を使っていてもそもそも標準の範囲外のことと思います。
# もう、WinMainから始まってる時点で…。

コンソールから、言語標準範囲のヘッダだけで完全適合なコードを書いても通らなかったときに、初めて文句を言いましょう。
# それでも、もっとダメダメなC++コンパイラの方が多いわけですが。

この回答への補足

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

補足日時:2006/09/06 16:42
    • good
    • 0

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

    • good
    • 0

陰謀ではありません。


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

参考URL:http://www.ttoyota.com/
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!