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!

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top