getline() в C ++ - _GNU_SOURCE не нужен?
Вопрос
Во-первых, я довольно новичок в C ++.Я верю, что getline()
не является стандартной функцией C, так что #define _GNU_SOURCE
требуется, чтобы его использовать.Сейчас я использую C ++, и g ++ говорит мне, что _GNU_SOURCE
уже определен:
$ g++ -Wall -Werror parser.cpp
parser.cpp:1:1: error: "_GNU_SOURCE" redefined
<command-line>: error: this is the location of the previous definition
Кто-нибудь может подтвердить, является ли это стандартным, или его определение скрыто где-то в моей настройке?Я не уверен в значении последней процитированной строки.
Файл включает в себя следующее, так что, предположительно, он определен в одном или нескольких из них?
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
#include <list>
#include <sstream>
Спасибо!
Решение
Я думаю, что g ++, начиная с версии 3, автоматически определяет _GNU_SOURCE
.Это подтверждается вашей третьей строкой в ошибке, в которой указано, что первое определение было выполнено в командной строке (без -D_GNU_SOURCE
в поле зрения):
<command-line>: error: this is the location of the previous definition
Если ты этого не хочешь, #undef
это как первая строка в вашем блоке компиляции.Однако вам это может понадобиться, и в этом случае используйте:
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
Причина, по которой вы получаете ошибку, заключается в том, что вы переопределяете ее.Это не должно быть ошибкой, если вы определяете его таким, каким оно уже было.По крайней мере, так обстоит дело с C, с C ++ все может быть по-другому.Основываясь на заголовках GNU, я бы сказал, что они выполняют неявный -D_GNU_SOURCE=1
вот почему он думает, что ты переопределение это к чему-то другому.
Следующий фрагмент должен сообщить вам его значение при условии, что вы его не меняли.
#define DBG(x) printf ("_GNU_SOURCE = [" #x "]\n")
DBG(_GNU_SOURCE); // first line in main.
Другие советы
Мне всегда приходилось использовать одно из следующих в C ++.Никогда раньше не приходилось ничего объявлять _GNU_.Обычно я работаю в * nix, поэтому обычно также использую gcc и g ++.
string s = cin.getline()
char c;
cin.getchar(&c);
Getline является стандартным, он определяется двумя способами.
Вы можете вызвать его как функцию-член одного из потоков следующим образом:Это версия, определенная в
//the first parameter is the cstring to accept the data
//the second parameter is the maximum number of characters to read
//(including the terminating null character)
//the final parameter is an optional delimeter character that is by default '\n'
char buffer[100];
std::cin.getline(buffer, 100, '\n');
или вы можете использовать версию, определенную в
//the first parameter is the stream to retrieve the data from
//the second parameter is the string to accept the data
//the third parameter is the delimeter character that is by default set to '\n'
std::string buffer;
std::getline(std::cin, buffer,'\n');
для дополнительной справки http://www.cplusplus.com/reference/iostream/istream/getline.html http://www.cplusplus.com/reference/string/getline.html