g ++破坏文件并使其大量增长

时间:2012-06-13 17:47:49

标签: c++ g++

编辑:哎呀!我打算包括我的编译命令。我使用了“g ++ -g -o war war.h war.cpp”

编辑2:这是我正在使用gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)编译的Linux服务器。此外,我试图重现这个问题并且无法解决,所以我真的不知道现在是什么导致它。

我一时兴起决定用c ++制作一个战争(纸牌游戏)模拟器。我从程序开始,我用所有#includes编写了一个头文件,并将源代码放在另一个文件中。我不小心在头文件和源代码中都有#includes,当我尝试编译时,它开始给我所有这些错误说(例如):

  

war.cpp:3815:错误:在程序war.cpp中迷路'\ 20':3815:12:警告:   null字符忽略war.cpp:3815:错误:stray'\ 21'在程序中   war.cpp:3815:错误:stray'\ 231'在程序war.cpp中:3815:18:警告:   null字符忽略war.cpp:3815:错误:stray'\ 20'在程序中   war.cpp:3815:20:warning:null字符忽略war.cpp:3815:   错误:stogram'\ 20'在程序war.cpp中:3815:错误:stray'\ 212'in   program war.cpp:3815:错误:在程序中错误'\ 217'

请记住,此程序此时<200个字符,因此导致编译器将所有这些字符写入文件。我很快发现问题是什么并纠正了,但我的问题是,这是怎么发生的?是什么原因导致编译器大量写入程序?当我取消编译器时(看起来它只是继续),文件在几秒钟内从几百字节增长到接近13 MB。我不是专家,但似乎这种事情会产生安全隐患,特别是因为我在我大学的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

3 个答案:

答案 0 :(得分:0)

几乎可以肯定是包括后卫在内。例如这会对你有用。我很确定你不需要两个破碎的包含防护装置来实现这一点,但是如果你理解为什么这种情况会让你麻烦,你就会明白这一点。

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

答案 1 :(得分:0)

这可能是因为您的文件中间某处有一些“神秘”的符号。例如,尝试使用十六进制编辑器找到它们。尝试删除此文件并再次写入。或者将此代码粘贴到某处,您可以在其中看到此符号。

答案 2 :(得分:0)

通常,编译器(任何编译器)应该只读取源,并且永远不应该回写它。

我会质疑服务器上磁盘的完整性。如果它只有一个磁盘可能会失败,我看到RAID偶尔会做奇怪的事情。

另一种可能性是编码正在改变或被错误地解释。如果您编写的计算机是基于Windows的,它可能采用Windows友好编码(http://en.wikipedia.org/wiki/Windows-1252),编译器可能期望UTF8(http://en.wikipedia.org/wiki/Utf8)。如果是这种情况,您可以切换到文本编辑器,让您手动选择字符编码。

如果是编码问题,您可以像spo1ler所说的那样,并使用十六进制编辑器从文件中删除额外的非渲染字符。我曾经遇到像这样的版权符号问题。