我目前有两个文件globals.h
和mainmenu.cpp
,它们是用于模拟书店的较大控制台应用程序的一部分。
相关的代码位可以在下面找到。
using std::fstream;
#ifndef GLOBALS_H
#define GLOBALS_H
// Other global variables here
extern fstream datafile;
#endif
#include <fstream>
#include <ios>
#include "globals.h"
using namespace std;
fstream datafile;
datafile.open("inventory.txt", ios::in | ios::out);
由于我目前无法理解的原因,Visual Studio在datafile.open()
行告诉我datafile
&#34;没有存储类或类型说明符&#34;,我得到以下内容我尝试编译时的输出:
1>------ Build started: Project: SerendipityBooksellers, Configuration: Debug Win32 ------
1> mainmenu.cpp
1>c:\path\to\project\mainmenu.cpp(32): error C2143: syntax error : missing ';' before '.'
1>c:\path\to\project\mainmenu.cpp(32): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\path\to\project\mainmenu.cpp(32): error C2371: 'datafile' : redefinition; different basic types
1> c:\path\to\project\globals.h(19) : see declaration of 'datafile'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我一直在寻找谷歌和StackOverflow,但似乎无法找到我想要的任何解决方案 - 我做错了什么?我唯一能想到的是,它抱怨我使用通用fstream
对象代替ifstream
和ostream
对象。
答案 0 :(得分:1)
C ++不支持文件级别的代码。它需要进入一个功能。例如,您可以:
fstream datafile;
void open_datafile()
{
datafile.open("inventory.txt", ios::in | ios::out);
}
显然,您需要从其他地方调用该函数。
此外,C ++确实在文件级别提供任意构造函数执行。如果您只想在程序启动时立即初始化文件,则可以使用接受与open相同的参数的fstream constructor:
fstream datafile("inventory.txt", ios::in | ios::out);
请记住,全局变量的构造顺序很大程度上未指定。 Globals在单个C ++文件中按其声明顺序初始化,但未指定文件之间的顺序。您应该避免使用这种表达式中的非平凡构造函数引用另一个全局变量。