getline () в C ++ - _GNU_SOURCE не требуется? - PullRequest
3 голосов
/ 18 февраля 2009

Во-первых, я довольно новичок в 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>

Спасибо!

Ответы [ 3 ]

5 голосов
/ 18 февраля 2009

Я думаю, что 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.
0 голосов
/ 18 февраля 2009

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

0 голосов
/ 18 февраля 2009

Мне всегда приходилось использовать одно из следующего в C ++. Никогда не должен был объявить _GNU_ ничего раньше. Я обычно работаю в * nix, поэтому обычно использую также gcc и g ++.

string s = cin.getline()

char c;
cin.getchar(&c);
...