-1

编辑:哎呀!我的意思是包括我的编译命令。我使用“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:3815:12中的杂散'\20':警告:忽略空字符war.cpp:3815:错误:程序war.cpp中的杂散'\21': 3815:错误:程序war.cpp:3815:18中的杂散“\ 231”:警告:忽略空字符war.cpp:3815:错误:程序war.cpp中的杂散“\ 20”:3815:20:警告:空字符被忽略war.cpp:3815:错误:程序war.cpp:3815中的杂散'\20':错误:程序war.cpp:3815中的杂散'\212':错误:杂散'\217 '在程序中

请记住,此时此程序的字符数小于 200,因此编译器将所有这些字符写入文件。我很快找出了问题所在并纠正了它,但我的问题是,这是怎么发生的?是什么导致编译器如此大量地写入程序?当我取消编译器时(看起来它会继续运行),文件在几秒钟内就从几百字节增长到近 13 MB。我不是专家,但似乎这种事情可能会产生安全隐患,特别是因为我是在我大学的 CS 部门服务器上通过 ssh 运行这个程序的。

对于它的价值,这是我编译时的代码:

战争.cpp:

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

using namespace std;

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

}

战争.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

几乎可以肯定是一个坏的包括后卫。例如,这会对你有用。我很确定你不需要两个损坏的包含守卫来发生这种情况,但如果你明白为什么这种情况会给你带来麻烦,你就会明白这一点。

酒吧.h:

#define BAR__H  //whoops
#ifndef BAR_H

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

#endif

富.h:

#define FOO__H  //whoops
#ifndef FOO_H

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

#endif
于 2012-06-13T17:52:46.360 回答
0

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

于 2012-06-13T17:54:11.373 回答
0

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

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

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

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

于 2012-06-13T17:58:12.080 回答