-2

私は cygwin をインストールし、それを使用して Windows で C++ をプログラミングしています。

私は自分のコード (これらは課題です) を Windows で書くことを好みますが、そのコードは Linux でも実行できる必要があります。ほとんどの場合、コードは問題なく移植されますが、Windows では動作するが、Linux ではセグメンテーション違反を引き起こすもの (初期化されていない変数やポインターの参照など) があるようです。

Windows (C:\cygwin\bin\g++.exe 経由) と Linux の両方で g++ を使用してコンパイルしますが、前者で機能するコードが後者で失敗する理由 (または単純に同じように動作しない理由) がわかりません。 )。コードを両方でまったく同じように動作させるにはどうすればよいですか? これは可能ですか?

私は C++ の初心者ですが、Windows 固有のライブラリを使用していないため、単純で重要なことを誤解している可能性があります。最後に、初期化されていない変数とポインターの使用が悪いことを知っています。それらを使用すると、Windows でセグメンテーション違反が発生したいと思います。

4

2 に答える 2

1

「初期化されていない変数とポインターを参照する」と説明していることは、未定義の動作と呼ばれます。これは、「あなたの運は変動する可能性がある」という意味です。あるシステムではある方法で何かを実行し、別のシステムでは別の方法で実行する可能性があります。残念なことに、「C および C++ は効率的な言語であると想定されている」の一部として、未定義の動作の動作は単なるものです。コンパイラはそれを気にする必要はなく、C または C++ 標準には何を定義するものは何もありません。起こるはずです。

コンパイラに適用-Wallすると、ほとんどすべてのタイプの初期化されていない変数に対して警告が表示されるはずです。

変数を宣言するときはいつでも、それに値を割り当てることをルールにしてください。これを行うことは決して悪い考えではありません。役に立たない値を代入しているだけだとしても、4 レベルの入れ子になったループのどこかで計算がうまくいかない理由を特定しようとするよりはましです。

Microsoft Visual Studio ツールを試すこともできます。これらのツールには無料の「Express Edition」があります。デバッグ モードでコンパイルすると、初期化されていない変数の使用を検出する (しようとする) 追加のコードが生成されます。

初期化されていない変数で失敗できる「ライブラリ」を知りません。

于 2013-04-01T13:08:49.887 に答える
1

初期化されていない変数やポインターの参照など

丁度。私の経験から、Windows でコンパイルされた C++ コード (Visual C++またはを使用MinGW GCC) ポインターが NULL に初期化されないことがわかりました。

したがって、このようなものはセグメンテーション違反になりません。(あなたは望んでいたものを手に入れていませんが、少なくともあなたはそれを知りません。残酷です。)

int *p;
*p = 1;
std::cout<<*p;

ただし、Linux システム (GCC) では、少なくともそれらを NULL に初期化するようです。したがって、上記のコードはセグメンテーション違反になります。

最善の解決策は、使用しているコンパイラの初期化されていない変数の警告 ( gcc Wuninitialized) を有効にしてから、すべての警告をエラーとして扱うように指示することです ( gcc Werror)。

少なくともコードを移植する前に、これを行うことができます。

さらに優れた分析を行うには、valgrindなどのツールを使用できます。

于 2013-04-01T13:15:19.567 に答える