请在将此问题标记为重复之前阅读此问题!
此问题与this question或this question或this question不重复,但它是相关的。我已经完成了所有这些问题以及更多问题。我有同样的基本问题,但我已经尝试了我找到的所有解决方案,这些其他问题的解决方案都没有对我有用。
问题是 Eclipse C.D.T.不承认许多C ++标准函数和功能。大多数无法识别的功能来自C ++ 11。无法识别的功能包括关键字nullptr
,变量NULL
和函数to_string()
,{{1 }},getLine()
,fstream.open()
,atoi()
,strcmp()
等。
在名为leeduhem和其他人的用户的帮助下,我设法将stricmp()
标志添加到Eclipse的-std=c++11
编译器命令中,因此编译过程中的错误消失了。
然而, Eclipse仍然以红色突出显示这些方法和符号,并将其标记为错误。
因此,总的来说,我的问题是:
如何让Eclipse在代码编辑器中识别C ++ 11函数和符号?
我已尝试过上述问题中的所有解决方案以及Eclipse's C++11 F.A.Q.中的解决方案,无论是否有this forum post中提到的修改。但是,没有任何作用。
我最近使用C / C ++插件在我的计算机上安装了NetBeans,尝试通过切换I.D.E.s来解决问题,但是 NetBeans具有完全相同的错误。
我在Linux Mint 16 Petra上运行Eclipse 3.8。我的主要编译器是GCC / G ++ 4.8.1,但我相信我也有Cygwin可用。
以下是有错误的代码示例:
g++
有什么想法吗?
提前感谢您提供的任何帮助。在这一点上,我非常绝望。这个问题极大地阻碍了我在C ++类项目上取得的进展,而且我没有足够的经验来尝试在没有I.D.E的情况下编写代码。 (我已经尝试过了。)
编辑:似乎有一些功能甚至#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
HubNode* hubs;
void debug();
void menu();
// main
int main() {
// initialize hubs
hubs = NULL;
// read Hub.csv
fstream hub_in;
hub_in.open("Hub.csv", ios::in);
if (!hub_in.is_open()) {
cout << "I couldn't open the Hub.csv file!";
return -1;
}
string read_name = "", read_location = "";
// skip the first line
getLine(hub_in, read_name);
if (read_name.empty()) {
cout << "The Hub.csv file was empty!";
return -1;
}
// then continue reading
while (getLine(hub_in, read_name, ',')) {
getLine(hub_in, read_location, '\n');
addHub(new HubNode(read_name, read_location));
}
// read Flight.csv
fstream flight_in;
flight_in.open("Flight.csv", ios::in);
if (!flight_in.is_open()) {
cout << "I couldn't open the Flight.csv file!";
return -1;
}
string read_number = "", read_price = "", read_source = "",
read_destination = "", read_minute = "", read_hour = "", read_day =
"", read_month = "", read_year = "", read_duration = "",
read_company = "";
// skip the first line
getLine(hub_in, read_number);
if (read_number.empty()) {
cout << "The Hub.csv file was empty!";
return -1;
}
// then continue reading
while (getLine(flight_in, read_number, ',')) {
getLine(flight_in, read_price, ',');
getLine(flight_in, read_source, ',');
getLine(flight_in, read_destination, ',');
getLine(flight_in, read_minute, '/');
getLine(flight_in, read_hour, '/');
getLine(flight_in, read_day, '/');
getLine(flight_in, read_month, '/');
getLine(flight_in, read_year, ',');
getLine(flight_in, read_duration, ',');
getLine(flight_in, read_company, '\n');
FlightNode* flight = new FlightNode(read_number,
atof(read_price.c_str()), read_company,
new Date_Time(atoi(read_minute.c_str()),
atoi(read_hour.c_str()), atoi(read_day.c_str()),
atoi(read_month.c_str()), atoi(read_year.c_str())),
atoi(read_duration.c_str()), read_source, read_destination);
}
cout << "Welcome to Ground Control! How may I assist you?";
menu();
string input;
cin >> input;
cin.ignore();
while (strcmp(input.c_str(), "q") != 0) {
if (strcmp(input.c_str(), "p") == 0)
debug();
else {
// TODO
}
cin >> input;
cin.ignore();
}
cout << "Have a nice flight!";
return -1;
}
// message utilities
void debug() {
HubNode* hub = hubs;
while (hub != NULL)
cout << hub->toString();
}
void menu() {
cout << "cmd | description";
cout
<< " p | prints the full list of airport hubs with all of their currently scheduled flight information";
// TODO
}
// Hub-managing utilities
bool addHub(HubNode* hub) {
// if hubs is null, make this hub the new head
if (hubs == NULL) {
hubs = hub;
return true;
}
// otherwise, find the end of the hubs list and add this hub to the end
HubNode* parser = hubs;
while (parser->next != NULL) {
// along the way, make sure this hub isn't already in the list
if (strcmp((parser->getName()).c_str(), (hub->getName()).c_str()) == 0)
return false;
parser = parser->next;
}
parser->next = hub;
return true;
}
HubNode* findHub(string name) {
HubNode* parser = hubs;
while (parser != NULL) {
if (strcmp((parser->getName()).c_str(), name.c_str()) == 0)
return parser;
parser = parser->next;
}
return NULL;
}
bool removeHub(HubNode* hub) {
return removeHub(hub->getName());
}
bool removeHub(string name) {
// check the first node alone first
if (hubs == NULL)
return false;
else if (strcmp((hubs->getName()).c_str(), name.c_str()) == 0) {
HubNode* to_remove = hubs;
hubs = hubs->next;
delete to_remove;
return true;
} else if (hubs->next == NULL)
return false;
HubNode* parser = hubs;
while (parser->next != NULL) {
if (strcmp((parser->next->getName()).c_str(), name.c_str()) == 0) {
HubNode* to_remove = parser->next;
parser->next = parser->next->next;
delete to_remove;
return true;
}
parser = parser->next;
}
return false;
}
无法识别从终端进行编译时,例如g++
。我还不确定是否有其他人,尽管它似乎能够理解stricmp()
和其他一些人。我的G ++版本是4.8.1,这几乎是最新的稳定版本....这可能导致Eclipse和NetBeans中的错误吗?
答案 0 :(得分:1)
Eclipse和NetBeans IDE很可能必须具有更新的解析器和词法分析器详细信息才能正确支持C ++ 11。希望有人已经为C ++ 11做了这个,并且可以发布更多细节。
看来NetBeans是用Java编写的,因为该产品的论坛有三篇帖子讨论旧版和更新版NetBeans版本的过程。
开始修改
我发现了一个非Eclipse帖子,它可能是Eclipse IDE中C ++ 11关键字识别的解决方案。评论:How do I use a custom gcc toolchain with Eclipse?。它有一个循序渐进的过程和屏幕截图,用于更新Eclipse中的GCC toochain。我希望CLang和CLang ++编译器集的支持类似。外部文章来自这篇SO帖子:Eclipse IDE for C++ hooking up multiple compiler toolset
结束编辑
我现在没有额外的时间来遵循NetBeans过程来为C ++ 11支持创建新的NetBeans解析器和词法分析器。也许其他人已经这样做了并且可以分享细节。我发现的帖子如下。请注意,这些是 NetBeans IDE中任何语言的教程。
上述两个步骤必须按此顺序进行。如果没有,我不知道会发生什么,但可能不是预期的结果。
我希望有更完整的帖子。也许其他用户只是忽略了IDE中不正确的关键字指示。 NetBeans 7.4似乎与CLang ++ 3.3编译器完美匹配。我在C ++ 11中心项目上没有C ++ 11编译错误。 IDE不正确地说override
无效。