-1

編集:おっと!コンパイルコマンドを含めるつもりでした。「g++-g -o warwar.hwar.cpp」を使用しました

編集2:これは私がgccバージョン4.4.3(Ubuntu 4.4.3-4ubuntu5)を使用してコンパイルしているLinuxサーバーです。また、問題を再現しようとしても再現できなかったので、今何が原因なのかよくわかりません。

気まぐれで、私はc ++で戦争(カードゲーム)シミュレーターを作ることにしました。私はプログラムを開始し、すべての#includeを含むヘッダーファイルを作成し、ソースコードを別のファイルに入れました。誤ってヘッダーファイルとソースコードの両方に#includesが含まれていて、コンパイルしようとすると、次のようなエラーが発生し始めました。

war.cpp:3815:エラー:プログラムwar.cpp:3815:12の迷走'\ 20':警告:ヌル文字はwar.cpp:3815を無視しました:エラー:プログラムwar.cppの迷走' \ 21': 3815:エラー:プログラムwar.cpp:3815:18の迷走'\ 231':警告:ヌル文字はwar.cpp:3815を無視しました:エラー:プログラムwar.cpp:3815:20の迷走' \ 20':警告:ヌル文字はwar.cpp:3815を無視しました:エラー:プログラムwar.cpp:3815の迷い'\ 20':エラー:プログラムwar.cpp:3815の迷い'\ 212':エラー:迷い'\ 217 'プログラム内

このプログラムはこの時点で200文字未満であったため、コンパイラがこれらすべての文字をファイルに書き込む原因となっていることに注意してください。私はすぐに問題が何であるかを理解して修正しましたが、私の質問は、これはどのように起こったのかということです。コンパイラがプログラムに大量に書き込む原因は何ですか?私がコンパイラーをキャンセルするまでに(それはちょうど続けようとしていたように見えました)、ファイルはほんの数秒で数百バイトからほぼ13MBに成長しました。私は専門家ではありませんが、特に大学のCS部門のサーバーでsshを介してこのプログラムを実行していたため、この種のことはセキュリティに影響を与える可能性があるようです。

価値のあるものとして、コンパイルしたときに持っていたコードは次のとおりです。

war.cpp:

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
    vector< pair<int, suit> > deck1;
    vector< pair<int, suit> >::iterator it1;

}

war.h:

#ifndef WAR_H
#define WAR_H

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

enum suit { HEARTS, SPADES, CLUBS, DIAMONDS };


#endif
4

3 に答える 3

0

ほぼ確実に壊れたインクルードガード。例えば、これはあなたにそれをします。これが発生するために2つの壊れたインクルードガードは必要ないと確信していますが、この状況が問題を引き起こす理由を理解していれば、アイデアを得ることができます。

bar.h:

#define BAR__H  //whoops
#ifndef BAR_H

#include "foo.h"
int bar();

#endif

foo.h:

#define FOO__H  //whoops
#ifndef FOO_H

#include "bar.h"
int foo();

#endif
于 2012-06-13T17:52:46.360 に答える
0

これは、ファイルの途中に「不思議な」記号が含まれているために発生する可能性があります。たとえば、16進エディタでそれらを見つけてみてください。このファイルを削除して、もう一度書き込みます。または、このコードをこの記号が表示されている場所に貼り付けます。

于 2012-06-13T17:54:11.373 に答える
0

一般に、コンパイラ (任意のコンパイラ) はソースを読み取るだけで、ソースに書き戻すことはありません。

サーバー上のディスクの整合性について質問します。ディスクが 1 つしかない場合は、障害が発生している可能性があります。

もう 1 つの可能性は、エンコーディングが変更されているか、正しく解釈されていないことです。あなたがそれを書いたコンピュータが Windows ベースの場合、コンパイラが UTF8 ( http ://en. wikipedia.org/wiki/Utf8 )。この場合、文字エンコーディングを手動で選択できるテキスト エディタに切り替えることができます。

エンコーディングの問題である場合は、spo1ler が言ったように実行し、16 進エディタを使用して余分なレンダリング以外の文字をファイルから削除できます。このような著作権記号で一度問題が発生しました。

于 2012-06-13T17:58:12.080 に答える