编辑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
答案 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所说的那样,并使用十六进制编辑器从文件中删除额外的非渲染字符。我曾经遇到像这样的版权符号问题。