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
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社の現行コンパイラに添付のヘッダを、保証がある状態で使うには多分そうなります。
回答ありがとうございます。
バックアップを取ってヘッダを書き換えたところ、確かにエラー件数は減ったので、できそうではあります。保障まで考えるとやらないほうがよさそうですか…
ともあれ、詳しい回答ありがとうございました。これで回答を締め切らせていただきます。
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;
がエラーになるとか、に対していうべきです。
この回答への補足
理由は「やってみたかったから」で、エラーが出たからといって、言語拡張を取り払わなければいい話なので、特に文句を言っているわけでもありませんよ。(陰謀という表現が悪かったか。
ただ、windows.hをインクルードしただけでエラーが出るので、これはどう足掻いてもできないという仕様なのか、それともヘッダの書き換えとかしてがんばればコンパイルできるようになるのか、というあたりが知りたかったのです。
下記コードであれば、
#include <windows.h>
int main(int argc, char* argv[]){
return 0;
}
bcc32 -A (ANSIに準拠) や、g++ -ansi -pedantic-errors(ANSIに準拠)ならコンパイルできるのですが、これすらできないので…
結局、windows.hなど、環境に依存するヘッダをインクルードする必要のあるものは言語拡張を使うしかないのでしょうか?
No.3
- 回答日時:
陰謀ではないでしょう。
あと、OSベンダとコンパイラベンダ等の立場の区別とかも考えられた方がよいかもしれません。
VS2005(というかVC8)においても、標準C/C++(ISO/IEC14882)の範囲だけでコードを書けばそのエラーはでなかったりしませんか。
ソレが出ているのは、VCが提供する「言語の標準ヘッダ」ではなく「Platform SDK(Windows用の環境依存ヘッダ)」ではないですか。
windows.hは、もともと標準でもなんでもない依存環境の独自ヘッダなのですから、言語拡張を使っていてもそもそも標準の範囲外のことと思います。
# もう、WinMainから始まってる時点で…。
コンソールから、言語標準範囲のヘッダだけで完全適合なコードを書いても通らなかったときに、初めて文句を言いましょう。
# それでも、もっとダメダメなC++コンパイラの方が多いわけですが。
この回答への補足
ということは、windows.hをインクルードする以上、この問題は解決し得ない問題なのでしょうか?
言語拡張切った状態で、これらのエラーを回避する方法は無いのでしょうか?
No.1
- 回答日時:
陰謀ではありません。
マイクロソフトは私企業ですから営利を追及する
権利を有します。
なお、言語仕様などの標準仕様には関係者の”好み”や人生観
が当然反映されています。ソフトウェアビジネスはそんなに甘
くありません。
紹介するURLの情報をじっくり読んでみるとよいでしょう。
参考URL:http://www.ttoyota.com/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(プログラミング・Web制作) Excel vbaでフォルダー内のpptをpptxにdocをdocxに変換 6 2022/09/01 21:03
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
実行後にコンパイルに失敗しま...
-
gcc コンパイル killed
-
ビープ音が鳴りません・・・
-
linux環境の変化とgccコンパイ...
-
MVSマシンで0C7でABENDしたので...
-
CPU Multi Processing をEnable...
-
C言語で作ったらWindowsでもMac...
-
メッセージボックスのEXEを作る...
-
c言語でログイン処理はできます...
-
notepad++でのコンパイル設定
-
math.hに含まれる関数が使えない
-
Visual Basic.NETの処理速度は6...
-
strcpyが古い形式として宣言さ...
-
libsshのコンパイルエラー
-
gccを使ってのリンク時のライブ...
-
プログラム Arduino
-
すべてのリビルド: 0 正常、 0 ...
-
Cのソースを毎回コンパイルし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
math.hに含まれる関数が使えない
-
C言語をコンパイルするとコンピ...
-
実行後にコンパイルに失敗しま...
-
ビープ音が鳴りません・・・
-
c言語です コンパイルした時に...
-
C#で char型とstring型の比較で...
-
すべてのリビルド: 0 正常、 0 ...
-
共有ライブラリの内容確認について
-
C言語で作ったらWindowsでもMac...
-
Verilog_HDLでのdefineとifdef
-
<math.h>ヘッダを入力している...
-
gcc コンパイル killed
-
64ビットのlinuxで32ビットメモ...
-
MVSマシンで0C7でABENDしたので...
-
[COBOL] ソースの復帰
-
プレコンパイルの意味を教えて...
-
libsshのコンパイルエラー
-
Visual Basic.NETの処理速度は6...
おすすめ情報