GCC 5.4.0编译Tony Gaddis教材C++代码失败求助
代码编译失败原因排查与修复方案
嘿,我帮你梳理下这段代码的问题,先看最显眼的语法错误:
你代码里else分支的输出语句没写完:
cout << fileName << "...
这里的字符串"...缺少了结尾的双引号,编译器根本没法识别这个不完整的字符串,这是直接导致编译失败的核心语法问题。
另外还有个潜在的兼容性点要注意:在C11之前的标准里,fstream::open()只接受C风格字符串(也就是const char*类型)作为文件名,但你直接传了std::string对象。不过GCC 5.4.0默认是支持C11的,所以正常编译不会有问题,但如果你的编译命令特意指定了C++98标准(比如加了-std=c++98),这也会触发错误。解决办法是调用fileName.c_str()来获取C风格的字符串指针:
file.open(fileName.c_str(), ios::in);
现在把修复后的完整代码贴给你:
#include<iostream> #include<fstream> #include<string> using namespace std; int main() { string fileName; char ch; fstream file; cout << "enter a filename: "; cin >> fileName; // 兼容C++98的写法,C++11及以上可直接传fileName file.open(fileName.c_str(), ios::in); if(file) { file.get(ch); while(file) { cout << ch; file.get(ch); } file.close(); } else { // 补全了闭合的引号和完整的提示信息 cout << fileName << " could not be opened." << endl; } return 0; }
如果编译时碰到C版本相关的报错,记得加上C11的编译选项:
g++ your_code.cpp -std=c++11 -o your_program
总结下关键问题:
- 未闭合的字符串字面量,这是触发编译错误的直接原因
- (可选)C版本兼容性问题,
std::string直接传入open()在C98中不被支持
内容的提问来源于stack exchange,提问作者user74091
相关产品推荐
相关产品推荐

