getline () em C ++ - _GNU_SOURCE não é necessário?
Pergunta
Em primeiro lugar, eu sou muito novo para C ++. Acredito que getline()
não é uma função C padrão, então #define _GNU_SOURCE
é necessário para usá-lo. Agora estou usando C ++ e g ++ me diz que _GNU_SOURCE
já está definido:
$ g++ -Wall -Werror parser.cpp
parser.cpp:1:1: error: "_GNU_SOURCE" redefined
<command-line>: error: this is the location of the previous definition
Alguém pode confirmar se esta é padrão, ou é a sua definição escondido em algum lugar na minha configuração? Eu não tenho certeza do significado da linha final citado.
O arquivo de inclui são os seguintes, então, presumivelmente, que é definido em um ou mais destes?
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
#include <list>
#include <sstream>
Obrigado!
Solução
Eu acho g ++, a partir da versão 3, automagicamente define _GNU_SOURCE
. Isto é suportado pela sua terceira linha do erro informando que a primeira definição foi feito na linha de comando (com um -D_GNU_SOURCE
nary à vista):
<command-line>: error: this is the location of the previous definition
Se você não quiser, #undef
-lo como a primeira linha na sua unidade de compilação. Você pode precisar dele, no entanto, em que caso de uso:
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
A razão que você está recebendo o erro é porque você está re definindo-lo. Não deve ser um erro se você defini-lo para o que já foi. Pelo menos esse o caso com C, que pode ser diferente com C ++. Com base nos cabeçalhos GNU, eu diria que eles estão fazendo um -D_GNU_SOURCE=1
implícito que é por isso que ele pensa que você está re-definindo -lo para outra coisa.
O seguinte trecho deve dizer-lhe o seu valor desde que você não tenha alterado.
#define DBG(x) printf ("_GNU_SOURCE = [" #x "]\n")
DBG(_GNU_SOURCE); // first line in main.
Outras dicas
Eu sempre tive que usar uma das seguintes opções em C ++. Nunca teve que declarar _GNU_ nada antes. Eu normalmente executado em * nix, então eu costumo usar gcc e g ++ também.
string s = cin.getline()
char c;
cin.getchar(&c);
Getline é padrão é definida de duas maneiras.
Você pode chamá-lo como uma função membro de uma das correntes da seguinte forma:
Esta é a versão definida em
//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');
ou você pode usar a versão definida em
//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');
para referência futura http://www.cplusplus.com/reference/iostream/istream/getline. html http://www.cplusplus.com/reference/string/getline.html